E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
Leetcode算法刷题记录
NSSCTF web
刷题记录
2
安洵杯2019]easy_web[NCTF2018]全球最大交友网站prize_p2[羊城杯2020]easyser[FBCTF2019]rceservice方法一方法二前言今天是2023年9月13号,
刷题记录
Sx_zzz
·
2023-09-18 06:42
刷题记录
前端
web安全
python
php
json
LeetCode算法
题-12. 整数转罗马数字(Swift)
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/integer-to-roman著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。题目罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符数值I1V5X10L50C100D500M1000例如,罗马数字2写做II,即为两个并列的1。12写做XII,即为X+II。27写做XX
entre_los_dos
·
2023-09-17 19:50
leetcode
刷题记录
704.二分查找 27.
classSolution:defsearch(self,nums:List[int],target:int)->int:left=0right=len(nums)-1whilelefttarget:right=middle-1else:returnmiddle#找到则返回#若没有找元素,则返回-1return-1lassSolution:defremoveElement(self,nums:Li
Atuosi
·
2023-09-17 18:35
leetcode
算法
【算法】PTA
刷题记录
1004成绩排名题目很简单,但太久没敲过代码甚至不记得sort函数怎么用。把姓名,学号,成绩存进结构体里。写一个cmp,就可以对结构体数组按照成绩进行排序。#includeusingnamespacestd;constintN=1e5+10;structstud{stringname,num;intscore;}stu[N];boolcmp(studa,studb){returna.score>n
想七想八不如11408
·
2023-09-17 07:41
pta刷题
算法
c++
数据结构
LeetCode算法
动态规划—剑指 Offer 10- II. 青蛙跳台阶问题
目录剑指Offer10-II.青蛙跳台阶问题题解:代码:运行结果:编辑一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。答案需要取模1e9+7(1000000007),如计算初始结果为:1000000008,请返回1。示例1:输入:n=2输出:2示例2:输入:n=7输出:21示例3:输入:n=0输出:1提示:0<=n<=100题解:多少种可能性的题目一般
turbo夏日漱石
·
2023-09-16 19:55
题解
leetcode
动态规划
算法
LeetCode算法
动态规划—斐波那契数列
目录剑指Offer10-I.斐波那契数列-力扣(LeetCode)题解:代码:运行结果:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项(即F(N))。斐波那契数列的定义如下:F(0)=0, F(1) =1F(N)=F(N-1)+F(N-2),其中N>1.斐波那契数列由0和1开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模1e9+7(1000000007),如计算初
turbo夏日漱石
·
2023-09-16 19:53
题解
算法
leetcode
动态规划
python LeetCode
刷题记录
69
题目给你一个非负整数x,计算并返回x的算术平方根。由于返回类型是整数,结果只保留整数部分,小数部分将被舍去。注意:不允许使用任何内置指数函数和算符,例如pow(x,0.5)或者x**0.5。代码classSolution:defmySqrt(self,x:int)->int:ifx==0:return0left,right=1,xwhileleft<=right:mid=(left+right)/
汪VV
·
2023-09-15 18:12
LeetCode
leetcode
python
python LeetCode
刷题记录
67
题目给你两个二进制字符串a和b,以二进制字符串的形式返回它们的和。示例1:输入:a="11",b="1"输出:"100"代码classSolution:defaddBinary(self,a:str,b:str)->str:returnbin(int(a,2)+int(b,2))[2:]进制转换#bin():将一个整数转换为二进制字符串。num=10binary_string=bin(num)pr
汪VV
·
2023-09-15 18:42
LeetCode
python
leetcode
python LeetCode
刷题记录
58
题目给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词是指仅由字母组成、不包含任何空格字符的最大子字符串。示例输入:s="HelloWorld"输出:5解释:最后一个单词是“World”,长度为5。代码classSolution:deflengthOfLastWord(self,s:str)->int:words=s.split()returnlen
汪VV
·
2023-09-15 18:41
LeetCode
python
leetcode
python LeetCode
刷题记录
66
题目给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位,数组中每个元素只存储单个数字。你可以假设除了整数0之外,这个整数不会以零开头。示例输入:digits=[4,3,2,1]输出:[4,3,2,2]解释:输入数组表示数字4321。代码classSolution:defplusOne(self,digits:List[int])->List[int]:a=
汪VV
·
2023-09-15 18:08
LeetCode
python
leetcode
leetcode算法
题--求1+2+…+n
原题链接:https://leetcode.cn/problems/qiu-12n-lcof/description/?envType=study-plan-v2&envId=coding-interviews快速乘,俄罗斯农民乘法funcsumNums(nint)int{res:=0A,B:=n,n+1add:=func()bool{res+=Areturnres>0}_=(B&1)>0&&ad
bob62856
·
2023-09-15 09:37
Algorithm
算法
leetcode
linux
Leetcode算法
入门与数组丨3. 数组基础
文章目录前言1数组简介2数组的基本操作2.1访问元素2.2查找元素2.3插入元素2.4改变元素2.5删除元素3总结task03task04前言Datawhale组队学习丨9月
Leetcode算法
入门与数组丨打卡笔记这篇博客是一个入门型的文章
AXYZdong
·
2023-09-15 07:17
【算法入门与数组】
算法
leetcode
linux
LeetCode算法
心得——和可被 K 整除的子数组(前缀和+HashMap)
大家好,我是晴天学长,同余定理的应用,需要的小伙伴可以关注支持一下哦!后续会继续更新的。1).和可被K整除的子数组题目描述给定一个整数数组A,返回其中元素之和可被K整除的(连续、非空)子数组的数目。示例:输入:A=[4,5,0,-2,-3,1],K=5输出:7解释:有7个子数组满足其元素之和可被K=5整除:[4,5,0,-2,-3,1],[5],[5,0],[5,0,-2,-3],[0],[0,-
晴天学长
·
2023-09-15 03:54
算法
算法
leetcode
职场和发展
python LeetCode
刷题记录
9
类别:简单题号:9给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不是。代码classSolution:defisPalindrome(self,x:int)->bool:result=Truex_str=str(x)ifx_str!=x_str[::-1]:result=False
汪VV
·
2023-09-15 02:11
LeetCode
leetcode
算法
职场和发展
python LeetCode
刷题记录
20
题目给定一个只包括‘(’,‘)’,‘{’,‘}’,‘[’,‘]’的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。示例1:输入:s="()"输出:true代码classSolution:defisValid(self,s:str)->bool:ls=[]dic={'(':')','{':'}',
汪VV
·
2023-09-15 02:38
LeetCode
python
leetcode
python LeetCode
刷题记录
14
题目14:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串“”。示例1:输入:strs=["flower","flow","flight"]输出:"fl"代码:classSolution:deflongestCommonPrefix(self,strs:List[str])->str:deffind_min_len_str(strs):#找到列表中最短的字符串ifno
汪VV
·
2023-09-14 21:49
LeetCode
python
leetcode
python LeetCode
刷题记录
27
题目给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。代码classSolution:defremoveElement(self,nums:List[int],val:int)->int:ifnotnums:return0j=0foriinrange(len(nums)):ifnums[i]!=val:nums[j]=nums[i]j+=1ret
汪VV
·
2023-09-14 18:47
LeetCode
python
leetcode
python LeetCode
刷题记录
28
题目给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。代码classSolution:defstrStr(self,haystack:str,needle:str)->int:ifnothaystackornotneedle:return0fori,ssi
汪VV
·
2023-09-14 18:47
LeetCode
python
leetcode
python LeetCode
刷题记录
26
题目给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。示例输入:nums=[0,0,1,1,1,2,2,3,3,4]输出:5,nums=[0,1,2,3,4]代码classSolution:defremoveDuplicates(self,nums:List[int])->int:
汪VV
·
2023-09-14 17:44
LeetCode
python
leetcode
python LeetCode
刷题记录
21
题目将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。注意:是链表代码classSolution:defmergeTwoLists(self,l1:Optional[ListNode],l2:Optional[ListNode])->Optional[ListNode]:ifl1andl2:ifl1.val>l2.val:l1,l2=l2,l1l1.nex
汪VV
·
2023-09-14 09:44
LeetCode
python
leetcode
20190404_ARTS_W00
2019第一篇arts,果然学习都是反人性的**Algorithm**每周至少做一个
leetcode算法
题**Review**阅读并点评至少一篇英文技术文章(英文论文文献)**Tip**至少学习一个技术技巧
活出野性的自己
·
2023-09-14 07:13
LeetCode算法
心得——和为k的子数组(前缀和+HashMap)
大家好,我是晴天学长,这是一个很重要的前缀和+hash运用的题,为后面很多的题打基础,需要的小伙伴可以关注支持一下哦!后续会继续更新的。1).和为k的子数组2).算法思路和为k的子数组1.首先是前缀和2.根据关系s【R】-s【L】=k如果是0开头,就是本身换算成s【L】=s【R】-k;那就一边前缀和,一边查找,然后一边存在hashmap,注意有负数。3).算法步骤1.创建一个HashMap对象ma
晴天学长
·
2023-09-13 21:29
算法
算法
leetcode
职场和发展
LeetCode算法
心得——判断能否在给定时间到达单元格(动态模拟)
大家好,我是晴天学长,这是一个动态模拟题,跟大佬相比,我的有点繁琐了,但是也算是锻炼到自己的一些细节问题,需要的小伙伴可以关注支持一下哦!后续会继续更新的。1).判断能否在给定时间到达单元格2).算法思路判断能否在给定时间到达单元格1.对角线永远是最快的2.所以算出至少要多少秒,就知道能不能恰好到达了。3.判定1.当不在一条直线上,直接走对角线(作图直接减坐标,就理解一些)终点在右上方,左上方x+
晴天学长
·
2023-09-13 21:58
算法
算法
leetcode
职场和发展
leetcode算法
专题训练:五.树专题
文章目录五.树专题144.二叉树的前序遍历94.二叉树的中序遍历145.二叉树的后序遍历102.二叉树的层序遍历107.二叉树的层次遍历2103.二叉树的锯齿形层次遍历100.相同的树101.对称二叉树226.翻转二叉树剑指Offer26.树的子结构110.平衡二叉树111.二叉树的最小深度104.二叉树的最大深度105.从前序与中序遍历序列构造二叉树106.从中序与后序遍历序列构造二叉树297.
Worthy_Wang
·
2023-09-13 11:41
Leetcode
算法
leetcode算法
专题训练:十二.动态规划专题
文章目录十二.动态规划专题70.爬楼梯62.不同路径63.不同路径2剑指Offer13.机器人的运动范围剑指Offer47.礼物的最大价值64.最小路径和120.三角形最小路径和118.杨辉三角119.杨辉三角244.通配符匹配10.正则表达式匹配97.交错字符串87.扰乱字符串115.不同的子序列72.编辑距离剑指Offer46.把数字翻译成字符串91.解码方法38.外观数列剑指Offer49.
Worthy_Wang
·
2023-09-13 11:41
Leetcode
算法
算法
leetcode
动态规划
个人GIT 开源项目 地址
功能点项目讲解FORINSTANCE
LeetCode算法
题精讲spi机制的实现JUC工具的引用等很多知识点的讲解和代码构建包括本博文中针对知识点的讲解都有具体的代码和讲解文档。
忧郁的双鱼座程序猿
·
2023-09-13 00:33
JAVA基础
JAVA成神之路
线程
java
多线程
面试
leetcode算法
每天一题001:两数之和(c++动态数组vector)
有关c++动态数组vector相比原始数组,动态数组有许多优势,c++原始数组存在越界问题,(在debug模式下对于长度为2的[],a[-1]会报错,但是在release模式下a[-1]=100,a[100]=100均能执行成功,但可能导致未知的错误),原始数组无法计算大小(可以使用sizeof(你定义的变量名称))/sizeof(int)的方式计算),且c++中函数是不能直接返回一个(原始类型的
FakeOccupational
·
2023-09-12 19:02
语言学习笔记
算法
c++
leetcode
【牛客网SQL进阶挑战系列】
刷题记录
:易忘知识点
目录【SQL2】知识点:多条、整个表数据插入插入记录的方式汇总:1.普通插入(所有字段)2.普通插入(指定字段)3.多条插入4.导入另一个表的数据【SQL3】知识点:REPLACEINTO解法一:用REPLACEINTO解法二:先删除已存在的数据【SQL4】知识点:更新数据第一种方式:设置为新值第二种方式:根据已有值替换【SQL6】知识点:DELETEFROM删除记录的方式汇总:1.根据条件删除2
郑粗心
·
2023-09-12 14:57
sql
数据库
LeetCode算法
题-Poor Pigs(Java实现)
这是悦乐书的第235次更新,第248篇原创01看题和准备今天介绍的是
LeetCode算法
题中Easy级别的第102题(顺位题号是455)。有1000个水桶,其中只有一个水桶含有毒药,其余的都没毒。
程序员小川
·
2023-09-12 14:46
Leetcode算法
入门与数组丨1. 数据结构与算法简介
文章目录前言1数据结构与算法1.1数据结构1.2算法2算法复杂度2.1算法复杂度简介2.2时间复杂度2.3空间复杂度3总结前言Datawhale组队学习丨9月
Leetcode算法
入门与数组丨打卡笔记这篇博客以及接下来几篇将会是一个入门型的文章
AXYZdong
·
2023-09-12 10:41
【算法入门与数组】
算法
leetcode
数据结构
LeetCode.1089-重复的0(Duplicate Zeros)
这是小川的第392次更新,第423篇原创01看题和准备今天介绍的是
LeetCode算法
题中Easy级别的第255题(顺位题号是1089)。
程序员小川
·
2023-09-12 06:33
【
LeetCode算法
系列题解】第51~55题
CONTENTSLeetCode51.N皇后(困难)LeetCode52.N皇后II(困难)LeetCode53.最大子序和(中等)LeetCode54.螺旋矩阵(中等)LeetCode55.跳跃游戏(中等)LeetCode51.N皇后(困难)【题目描述】按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。N皇后问题研究的是如何将N个皇后放置在n×n的棋盘上,并且使皇后彼此之
柃歌
·
2023-09-11 12:55
LeetCode
算法
leetcode
职场和发展
学习
c++
leetcode算法
题--生成特殊数字的最少操作
原题链接:https://leetcode.cn/problems/minimum-operations-to-make-a-special-number/description/感觉还是比较难想到的。。funcminimumOperations(numstring)int{res:=len(num)ifstrings.Contains(num,"0"){res--}f:=func(tailstr
bob62856
·
2023-09-11 04:55
Algorithm
算法
leetcode
职场和发展
LeetCode算法
题:2. 两数相加
文章目录题目描述:通过代码创建新一串新链表:题目描述:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。题目链接:2.两数相加通过代码创建新一串新链表:优点是便于思考操作,但是会增加存储空间的占用,如果链表内的数据本身就很大,就会加剧内存的
Aer_7z
·
2023-09-10 06:50
算法
leetcode
笔记
链表
c++
LeetCode - #13 罗马数字转整数
LeetCode算法
到目前我们已经更新了12期,我们会保持更新时间和进度(周一、周三、周五早上9:00发布),每期的内容不多,我们希望大家可以在上班路上阅读,长久积累会有很大提升。
Swift社区
·
2023-09-10 01:02
【
LeetCode算法
系列题解】第56~60题
CONTENTSLeetCode56.合并区间(中等)LeetCode57.插入区间(中等)LeetCode58.最后一个单词的长度(简单)LeetCode59.螺旋矩阵II(中等)LeetCode60.第k个排列(困难)LeetCode56.合并区间(中等)【题目描述】以数组intervals表示若干个区间的集合,其中单个区间为intervals[i]=[start_i,end_i]。请你合并所
柃歌
·
2023-09-09 23:53
LeetCode
算法
leetcode
职场和发展
c++
学习
[DEBUG] springboot+freemarker+shiro控制按钮的出现与隐藏
更多技术文章请访问我的博客园账户:点击这里那边会更新有关生物信息学,javaWeb,统计学理论和一些杂七杂八的记录:)leetcode
刷题记录
争取日更(github):点击这里部分敏感信息已打码。
陆书生
·
2023-09-09 08:04
LeetCode
刷题记录
——从零开始记录自己一些不会的
1.最多可以摧毁的敌人城堡数目题意思路两层循环,太low了用一个变量记录前一个位置代码classSolution{public:intcaptureForts(vector&forts){intans=0,pre=-1;for(inti=0;i=0&&forts[i]!=forts[pre]){ans=max(ans,i-pre-1);}pre=i;}}returnans;}};2.到达终点的数字
码尔泰
·
2023-09-08 21:08
leetcode
算法
职场和发展
算法
刷题记录
-Hash(LeetCode)
820.ShortEncodingofWords思路Hashset有个特点remove的元素不在set里面的话,是删除不了什么东西的。例如题目中的样例,timemebell,删除ime的话是什么都不会发生的。利用这一点,我们可以把每个string元素从第一位开始从set中删除。代码publicintminimumLengthEncoding(String[]words){Setset=newHas
ほしのした
·
2023-09-08 19:52
算法
算法
哈希算法
leetcode
算法
刷题记录
-DP(LeetCode)
746.MinCostClimbingStairs代码intminCostClimbingStairs(vector&cost){if(cost.size()=arr[j]arr[i]−arr[j]>=arr[j]arr[i]−arr[j]>=arr[j],说明即使存在值为arr[i]−arr[j]arr[i]−arr[j]arr[i]−arr[j]的下标ttt,根据arr单调递增性质,也不满足t
ほしのした
·
2023-09-08 19:51
算法
算法
leetcode
职场和发展
算法
刷题记录
-树(LeetCode)
783.MinimumDistanceBetweenBSTNodes思路(DFS中序遍历)考虑中序遍历的性质即可代码classSolution{public:intmin_diff=numeric_limits::max();intprev=numeric_limits::min()+100000;intminDiffInBST(TreeNode*root){inorderTraversal(ro
ほしのした
·
2023-09-08 19:51
算法
算法
leetcode
深度优先
算法
刷题记录
(LeetCode 1-30)
1.TwoSum(Solved)publicint[]twoSum(int[]nums,inttarget){HashMaps=newHashMap();for(inti=0;i0){ListNodelast=newListNode(hyper);curr.next=last;}returndummy.next;}3.LongestSubstringWithoutRepeatingCharacte
ほしのした
·
2023-09-08 19:21
算法
深度优先
java
算法
算法
刷题记录
-双指针/滑动窗口(LeetCode)
809.ExpressiveWords思路根据题目描述,我们可以知道,如果要将某个单词定义为可扩张(stretchy),需要满足如下两个条件:所以,我们在实现的时候,可以通过两个指针p1和p2,分别指向s和word,分别统计连续的相同字符数量c1和c2,然后再通过上述的两个条件进行判断,即:如果(c1!=c2&&c1=3)则表示该单词不是可扩张的。代码classSolution{publicint
ほしのした
·
2023-09-08 19:48
算法
leetcode
职场和发展
[
刷题记录
]牛客面试笔刷TOP101
牛客笔试算法必刷TOP101系列,每日更新中~1.合并有序链表2023.9.3合并两个排序的链表_牛客题霸_牛客网(nowcoder.com)题意大致为:将两个链表中的元素按照从小到大的顺序合并成为一个链表.所给予的条件:给出的所要合并的链表都是从小到大顺序排列的.思路:创建一个新的头节点来方便组装新的链表.分别用两个指针遍历两个链表,比较两个指针所在的节点,较小的节点先一步存放到新链表中,并且相
HY_PIGIE
·
2023-09-08 12:55
算法
【
LeetCode算法
系列题解】第61~65题
CONTENTSLeetCode61.旋转链表(中等)LeetCode62.不同路径(中等)LeetCode63.不同路径II(中等)LeetCode64.最小路径和(中等)LeetCode65.有效数字(困难)LeetCode61.旋转链表(中等)【题目描述】给你一个链表的头节点head,旋转链表,将链表每个节点向右移动k个位置。【示例1】输入:head=[1,2,3,4,5],k=2输出:[4
柃歌
·
2023-09-08 00:40
LeetCode
算法
leetcode
职场和发展
c++
学习
LeetCode算法
题合集—数组篇
数组基础算法题1.二分查找https://leetcode-cn.com/problems/binary-search/给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1题解:classSolution{publicintsearch(int[]nums,inttarget){intleft=0;in
fllow_wind
·
2023-09-07 23:14
算法
算法
java
LeetCode刷题-二维数组中的查找
前言说明算法学习,日常
刷题记录
。题目连接二维数组中的查找题目内容在一个n*m的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
纯洁编程说
·
2023-09-07 14:44
leetcode
刷题记录
-找出这两个有序数组的中位数(python版本)
谨以此文记录一下自己刷题的过程,虽然技术能力一般,相信刷完整套题目自己的编程能力定会有提高,代码都是个人创作,不一定是最好的,仅供参考和交流给定两个大小为m和n的有序数组nums1和nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(m+n))。你可以假设nums1和nums2不会同时为空。示例1:nums1=[1,3]nums2=[2]则中位数是2.0示例2:num
Lovely_bb
·
2023-09-07 10:30
LeetCode算法
心得——生成特殊数字的最少操作(贪心找规律)
大家好,我是晴天学长,这是一个简单贪心思维技巧题,主要考察的还是临场发挥的能力。2).算法思路000502575末尾是这两个的才能被45整除思路:分别找,输出最少次数3).代码示例classSolution{publicstaticintminimumOperations(Stringnum){returnMath.min(min00and50and0(num),mini25and75(num))
晴天学长
·
2023-09-07 09:15
算法
leetcode
java
LeetCode算法
题-Minimum Distance Between BST Nodes(Java实现-四种解法)
这是悦乐书的第314次更新,第335篇原创01看题和准备今天介绍的是
LeetCode算法
题中Easy级别的第183题(顺位题号是783)。
程序员小川
·
2023-09-06 09:17
上一页
14
15
16
17
18
19
20
21
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他