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
南邮NOJ刷题记录
CTF
刷题记录
刷题我的md5脏了KFC疯狂星期四坤坤的csgo邀请simplePHPcurl我的md5脏了g0at无意间发现了被打乱的flag:I{i?8Sms??Cd_1?T51??F_1?}但是好像缺了不少东西,flag的md5值已经通过py交易得到了:88875458bdd87af5dd2e3c750e534741flag的MD5值,写了好久的没有加ISCTF{},有些迷茫,多次尝试出来了#生成MD5值i
`流年づ
·
2023-12-22 09:09
web学习
web安全
刷题记录
Day17-二叉树(平衡二叉树、二叉树的所有路径、左叶子之和)
刷题记录
Day17-二叉树(平衡二叉树、二叉树的所有路径、左叶子之和)文章目录
刷题记录
Day17-二叉树(平衡二叉树、二叉树的所有路径、左叶子之和)前言一、平衡二叉树1.110平衡二叉树二、二叉树的所有路径
Carp3di3m
·
2023-12-21 20:01
刷题记录
c++
c语言
leetcode
数据结构
算法
刷题记录
Day16-二叉树(二叉树的最大最小深度、完全二叉树的节点个数)
刷题记录
Day16-二叉树(二叉树的最大最小深度、完全二叉树的节点个数)文章目录
刷题记录
Day16-二叉树(二叉树的最大最小深度、完全二叉树的节点个数)前言一、二叉树的最大深度1.104二叉树的最大深度
Carp3di3m
·
2023-12-21 20:30
刷题记录
c++
c语言
leetcode
数据结构
算法
刷题记录
Day15-二叉树(层序遍历、翻转二叉树、对称二叉树)
刷题记录
Day15-二叉树(层序遍历、翻转二叉树、对称二叉树)文章目录
刷题记录
Day15-二叉树(层序遍历、翻转二叉树、对称二叉树)前言一、二叉树的层序遍历1.102二叉树的层序遍历2.107二叉树的层序遍历
Carp3di3m
·
2023-12-21 20:30
刷题记录
c++
c语言
leetcode
数据结构
算法
刷题记录
Day6-哈希表(有效的字母异位词、两个数组的交集、快乐数、两数之和)
刷题记录
Day6-哈希表(有效的字母异位词、两个数组的交集、快乐数、两数之和)文章目录
刷题记录
Day6-哈希表(有效的字母异位词、两个数组的交集、快乐数、两数之和)前言一、有效的字母异位词1.242有效的字母异位词二
Carp3di3m
·
2023-12-21 20:29
刷题记录
c++
c语言
leetcode
数据结构
算法
刷题记录
Day3-链表(移除链表元素、设计链表、反转链表)
刷题记录
Day3-链表(移除链表元素、设计链表、反转链表)文章目录
刷题记录
Day3-链表(移除链表元素、设计链表、反转链表)前言一、移除链表元素1.203移除链表元素二、设计链表1.707设计链表三、反转链表
Carp3di3m
·
2023-12-21 20:59
刷题记录
c++
c语言
leetcode
数据结构
算法
刷题记录
Day4-链表(两两交换链表中的节点、删除链表的倒数第N个节点、链表相交、环形链表)
刷题记录
Day4-链表(两两交换链表中的节点、删除链表的倒数第N个节点、链表相交、环形链表)文章目录
刷题记录
Day4-链表(两两交换链表中的节点、删除链表的倒数第N个节点、链表相交、环形链表)前言一、两两交换链表中的节点
Carp3di3m
·
2023-12-21 20:59
刷题记录
c++
c语言
leetcode
数据结构
算法
刷题记录
Day1-数组(二分查找,移除元素)
刷题记录
Day1(二分查找,移除元素)简单记录文章目录
刷题记录
Day1(二分查找,移除元素)前言一、二分查找1.704二分查找2.35搜索插入位置3.34在排序数组中查找元素的第一个和最后一个位置4.69x
Carp3di3m
·
2023-12-21 20:29
刷题记录
c++
c语言
leetcode
数据结构
算法
刷题记录
Day18-二叉树(找树左下角的值、路径总和、从中序与后序遍历序列构造二叉树)
刷题记录
Day18-二叉树(找树左下角的值、路径总和、从中序与后序遍历序列构造二叉树)文章目录
刷题记录
Day18-二叉树(找树左下角的值、路径总和、从中序与后序遍历序列构造二叉树)前言一、找树左下角的值
Carp3di3m
·
2023-12-21 20:25
刷题记录
c++
c语言
leetcode
数据结构
算法
力扣算法
刷题记录
目录前言一、数组篇一、问题一二、问题二三、问题三四、问题四前言没刷过算法题,感觉自己算法方面的知识较为薄弱,在力扣上看了几道发现自己都不会,看了解题答案后才感觉逐渐明朗,所以来记录一下算法题。一、数组篇一、问题一给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排
lhhbk
·
2023-12-20 19:47
算法
leetcode
力扣
刷题记录
(16)LeetCode:62、63、343、96
目录62.不同路径63.不同路径II343.整数拆分96.不同的二叉搜索树总结这题比较简单,直接声明一个二维数组来保存到达该点有几种路径。到达当前点的方法由当前点的左边格子和右边格子决定。classSolution{public:intuniquePaths(intm,intn){vector>mesh;for(inti=0;irow;for(intj=0;j>&obstacleGrid){for
蓝墨408
·
2023-12-20 08:10
leetcode
算法
数据结构
c++
Leetcod面试经典150题
刷题记录
—— 双指针篇
双指针篇1.验证回文串Python32.判断子序列Python3双指针3.两数之和II-输入有序数组Python34.盛最多水的容器Python3双指针5.三数之和1.验证回文串题目链接:验证回文串-leetcode题目描述:如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个回文串。题目归纳:和传统的回文串验证不一样,有一些非(字母数
躬身入世,以生证道
·
2023-12-19 10:28
Algorithm
面试
算法
职场和发展
力扣
刷题记录
(13)LeetCode:406、452、435
目录406.根据身高重建队列452.用最少数量的箭引爆气球435.无重叠区间406.根据身高重建队列题目说有一个people数组,people的元素也是一个数组,里面包含h和k,h表示人的身高,k表示前面有k个人的身高高于自己。现在要就你根据h、k这两个维度对people进行重新排序。和上一篇文章的135.分发糖果问题一样,要同时考虑两个维度。分发糖果是一个维度一个维度地去解决的,正反两次遍历。这
蓝墨408
·
2023-12-18 14:55
leetcode
算法
数据结构
c++
力扣
刷题记录
(14)LeetCode:763、56、738
目录763.划分字母区间56.合并区间738.单调递增的数字总结763.划分字母区间这道题的关键点在于想到使用一个数组去存放每个字母在字符串中的最大索引。之后我们在遍历字符串的时候就知道应该在什么地方停止,想要得到最大分割次数,就应该在当前索引等于遍历过的字母在字符串中的最大索引时划分。classSolution{public:vectorpartitionLabels(strings){intl
蓝墨408
·
2023-12-18 14:55
leetcode
算法
数据结构
c++
力扣
刷题记录
(12)LeetCode:45、1005、135、860
45.跳跃游戏II这题的解题思路关键在于如何在当前覆盖范围内寻找下一次跳跃能够覆盖的最大范围。比如示例一:第一次能够跳两个格子,当前的覆盖范围就是[2,3,1],那么2明显不能够跳到最后,所以我们需要再进行一次跳跃,也就是第二次跳跃。第二次跳跃需要我们在第一次跳跃所能覆盖的范围内寻找,也就是在[3,1]中寻找。很明显在3的位置可以跳的最远,于是我们两次跳跃后能够覆盖的范围就到了4这个位置。4已经到
蓝墨408
·
2023-12-18 14:55
leetcode
算法
数据结构
c++
力扣
刷题记录
(7)LeetCode:77、216、17、39
77.组合这道题需要用到回溯算法。我们可以遍历[1,n]中的每一个值,当我们在[1,n]中取了一个值时,我们就利用递归从剩下的集合中再取一个值,反复进行递归操作直到取到的值的数量等于k,然后向上回溯。classSolution{public://path存储当前搜索到的组合vectorpath;//ans存储符合条件的组合vector>ans;vector>combine(intn,intk){b
蓝墨408
·
2023-12-18 14:24
leetcode
算法
数据结构
c++
力扣
刷题记录
(8)LeetCode:40、131、93
40.组合总和II这道题跟上篇文章的39题差不多,就是要多解决一个问题——去重。如果是将所有答案都存储在容器中之后再去重,那就比较耗时。这里要想办法在遍历的过程中去重。可以将遍历的过程看作是在遍历一棵树,当确立了根节点,其余可以取的值就都是该根节点的孩子结点。去重的操作就是保证同层的结点的值不能重复,但是在保证每个元素只取一次的前提下同一个路径(从根节点到某一叶子结点)的元素是可以重复的。同层重复
蓝墨408
·
2023-12-18 14:24
leetcode
算法
数据结构
c++
力扣
刷题记录
(9)LeetCode:79、90、491、46、47
78.子集这道题和前几题有些不一样,前几题都是有条件的收集路径path。比如对路径path的大小加一限制,或者对路径path的和加以限制。但是在这道题中对路径path没有任何限制,只需要我们在取出一个值后,将值输入result中,再从剩余元素中取一值,不断递归回溯。classSolution{private:vector>result;vectorpath;voidbacktracking(vec
蓝墨408
·
2023-12-18 14:24
leetcode
算法
数据结构
c++
力扣
刷题记录
(2)LeetCode:404、513、112、106
404.左叶子之和这道题的问题在于如何去判断该结点是否是左叶子结点。比如说示例1:判断9是否是左叶子结点?如果我们遍历到9这个结点了再去判断9是否是叶子结点的话那肯定就不好判断了,但如果我们在3结点处就来判断9结点,那问题就简单了。classSolution{public:intsumOfLeftLeaves(TreeNode*root){if(root==nullptr)return0;intl
蓝墨408
·
2023-12-18 14:54
leetcode
算法
数据结构
c++
力扣
刷题记录
(3)LeetCode:654、617、98
654.最大二叉树这道题很简单,主要是两点:一是确定根节点,二是维护集合nums。剩下的直接交给递归就OK了。根节点很好确定,直接遍历nums即可,取出最大值作为根节点。维护集合nums:将根节点在nums中左侧的集合赋值给根节点左子树的nums,将根节点在nums中右侧的集合赋值给根节点右子树的nums。classSolution{public:TreeNode*constructMaximum
蓝墨408
·
2023-12-18 14:54
leetcode
算法
数据结构
c++
力扣
刷题记录
(15)LeetCode:509、70、746
目录509.斐波那契数70.爬楼梯746.使用最小花费爬楼梯总结用一个数组来存储前两个数的值,然后根据前两个数的值来确定当前的值。classSolution{public:intfib(intn){if(nv;v.push_back(0);v.push_back(1);intnum=0,i=2;while(v.size()-1&cost){intdp[cost.size()+1];dp[0]=0;
蓝墨408
·
2023-12-18 14:48
leetcode
算法
数据结构
c++
《感恩日记》Day31
2.谢谢好朋友从湖
南邮
寄过来的衣服,收到了,就是大些,但穿上是我喜欢的风格,很素雅,喜欢,谢谢,谢谢!3.今天见了供应商明明姐,聊起孩子,工作,机遇,晚上回家又接
小窗幽记_hj
·
2023-12-18 09:56
力扣
刷题记录
-- JAVA---99--746. 使用最小花费爬楼梯
目录一、题目二、代码三、运行结果一、题目二、代码classSolution{publicintminCostClimbingStairs(int[]cost){intlength=cost.length;inti;int[]dp=newint[length+1];dp[0]=cost[0];dp[1]=cost[1];for(i=2;i<=length-1;i++){dp[i]=Math.min(
@白圭
·
2023-12-18 00:05
#
leetcode
java
算法
NSSCTF web
刷题记录
7
文章目录[SDCTF2022]CURLUpandRead[NUSTCTF2022新生赛]Translate[安洵杯2020]BASH[GXYCTF2019]StrongestMind[BJDCTF2020]Marklovescat[HNCTF2022WEEK2]ohmywordpress[极客大挑战2020]rceme[网鼎杯2018]comment[HGAME2023week4]SharedDi
_rev1ve
·
2023-12-17 03:34
刷题记录
web安全
安全
学习
php
CTF-文件包含(1)
南邮
杯CTF文件包含题目地址:asdf点击后利用file函数对show.php进行文件利用使用伪协议php://filter/read=convert.base64-encode/resource=index.php
Plkaciu
·
2023-12-16 20:23
#
web
web安全
做题笔记:SQL Sever 方式做牛客SQL的题目--VQ
----VQ查询用户刷题日期和下一次刷题日期现有牛客
刷题记录
表questions_pass_record,请查询用户user_id,刷题日期date(每组按照date降序排列)和该用户的下一次刷题日期nextdate
程饱饱吃得好饱
·
2023-12-07 00:46
习题练习
知识点
笔记
sql
python
sqlserver
做题笔记:SQL Sever 方式做牛客SQL的题目--VQ29
----VQ29验证刷题效果,输出题目真实通过率牛客
刷题记录
表done_questions_record,为验证重复刷题率,需要我们查找一些数据:question_pass_rate表示每个用户不同题目的通过率
程饱饱吃得好饱
·
2023-12-07 00:14
知识点
习题练习
笔记
sql
sqlserver
力扣
刷题记录
-- JAVA---114--213. 打家劫舍 II
目录一、题目二、代码三、运行结果一、题目二、代码classSolution{publicintrob(int[]nums){inti;intlength=nums.length;if(length==1)returnnums[0];if(length==2)returnMath.max(nums[0],nums[1]);if(length==3)returnMath.max(nums[0],Mat
@白圭
·
2023-12-06 17:38
#
leetcode
java
python
BUUCTF-WEB-
刷题记录
(2)
[网鼎杯2018]Fakebook注册一个账户,进去之后查看源代码,感觉存在注入点是数字型注入,payload:1%20and(false)1%20and(true)判断列数1orderby5改为4的时候则页面正常判断显示位,可以看见第二列存在数据回显0union/**/select1,2,3,4查看可执行的权限路径:0%20union/**/select%201,@@global.secure_
cike_y
·
2023-12-06 10:44
CTF刷题记录
网络安全
CTF
安全
笔记
【期末复习】(免费)2021-2022
南邮
数据库系统原理期末复习题
pwd=dwss提取码:dwss放图片了,太麻烦,需要的同学点击下方链接(free)ppt样题请看下方:【期末复习】2021-2022
南邮
数据库系统原理期末复习题ppt封面:实验报告实验名称创建数据库模式与
梦想减肥的dw
·
2023-12-05 10:20
南邮期末复习
数据库
sql
sqlite
mysql
数据库开发
leetcode专题
刷题记录
I——二叉树
按照一位b站up主的刷题推荐顺序进行学习每道题的题解代码有的参考他的题解或者leetcode评论区题解文章目录144二叉树前序遍历94二叉树中序遍历145二叉树的后序遍历=根右左的逆序173二叉树迭代器102二叉树的层序遍历103二叉树的锯齿形遍历107二叉树的层序遍历II98验证二叉搜索树99恢复二叉搜索树230二叉搜索树最小的第K个元素257二叉树的所有路径199二叉树的右视图198打家劫舍2
huangyuan2019
·
2023-12-04 18:00
技能
LeetCode
刷题记录
--模拟
文章目录1.788.旋转数字2.38.外观数列3.2075.解码斜向换位密码4.2232.向表达式添加括号后的最小结果5.59.螺旋矩阵II6.37.解数独7.36.有效的数独8.1222.可以攻击国王的皇后9.657.机器人能否返回原点9.874.模拟行走机器人10.2069.模拟行走机器人II1.788.旋转数字原题链接 我们称一个数X为好数,如果它的每位数字逐个地被旋转180度后,我们仍可
爱吃烤秋刀鱼
·
2023-12-04 04:01
LeetCode刷题记录
leetcode
算法
c++
Leetcod面试经典150题
刷题记录
——栈篇
栈篇
刷题记录
1.有效的括号Python3写法1——官方题解(不直观较难理解)写法2——Krahets(简洁易懂)写法3——综合2.简化路径Python3写法1——奇技淫巧写法2——栈堆和栈是有区别的,平常经常连起来用
躬身入世,以生证道
·
2023-12-02 09:47
Algorithm
面试
python
职场和发展
Leetcod面试经典150题
刷题记录
——数组 / 字符串篇
数组/字符串篇1.合并两个有序数组Python3排序法双指针法2.删除有序数组中的重复元素3.H指数Python3排序法计数排序法二分查找有个技巧,若想熟悉语言的写法,可以照着其它语言的题解,写目标语言的代码,比如有C/C++的题解,写Python的算法,这样同时可以对比两种语言,并熟悉Python代码中API的使用,并且可以增强代码的迁移能力,语言只是一种实现的工具,不被语言束缚也是一种自由。1
躬身入世,以生证道
·
2023-12-02 09:38
Algorithm
面试
职场和发展
刷题记录
(自己看的习题本)(74_11.30)
杂区间和(离散化)题目链接:802.区间和-AcWing题库#include#include#includeusingnamespacestd;constintN=300010;//n次插入和m次查询相关数据量的上界intn,m;inta[N];//存储坐标插入的值ints[N];//存储数组a的前缀和vectoralls;//存储(所有与插入和查询有关的)坐标vector>add,query;/
德布得寥
·
2023-12-01 10:42
算法
数据结构
力扣
刷题记录
-- JAVA--6---189. 轮转数组
目录一、题目二、代码三、运行结果一、题目二、代码classSolution{publicvoidrotate(int[]nums,intk){inti;intlength=nums.length;inttemp=0;System.out.println("length"+length);k=k%length;for(i=0;i=0&&(k-1-i)=0&&(length-1+k-i)
@白圭
·
2023-12-01 08:54
#
leetcode
java
python
力扣
刷题记录
-- JAVA--15--- 189. 轮转数组
目录一、题目二、代码三、运行结果一、题目二、代码classSolution{//空间复杂度为1先对整体数组反转然后再对两个分割后的数组反转publicvoidrotate(int[]nums,intk){inti;intlength;length=nums.length;k=k%length;for(i=0;i
@白圭
·
2023-12-01 08:24
#
leetcode
java
python
南京知名装修公司鲁工大宅,大门紧闭,这究竟是为何?
正所谓隔行如隔山面对自己不熟悉的东西的时候我们总是不知道做什么选择今天小编听到了一个大事件南京某知名装饰工厂存在大量装修金钱问题(图源网络·侵删)公司科普小编在听到消息的第一瞬间先去了解了一下公司的背景南京鲁工大宅装饰工厂店坐落于新模范马路66号
南邮
大厦
2915e7de043a
·
2023-11-30 23:48
[DASCTF 2023 & 0X401七月暑期挑战赛] web
刷题记录
文章目录EzFlask方法一python原型链污染方法二flask框架静态文件方法三pin码计算MyPicDisk方法一字符串拼接执行命令方法二phar反序列化ez_cmsEzFlask考点:python原型链污染、flask框架理解、pin码计算源码如下importuuidfromflaskimportFlask,request,sessionfromsecretimportblack_list
_rev1ve
·
2023-11-30 22:30
刷题记录
前端
python
学习
web安全
安全
php
[VNCTF 2023] web
刷题记录
文章目录象棋王子电子木鱼BabyGo象棋王子考点:前端js代码审计直接查看js源码,搜一下alert丢到控制台即可电子木鱼考点:整数溢出main.rs我们分段分析首先这段代码是一个基于Rust的web应用程序中的路由处理函数。它使用了Rust的异步框架Actix和模板引擎Tera。然后就是定义了不同结构体并且自动生成了序列化#[derive(Serialize)]structAPIResult{s
_rev1ve
·
2023-11-30 22:27
刷题记录
web安全
安全
php
python
学习
go
力扣
刷题记录
83.1-----135. 分发糖果
目录一、题目二、代码三、运行结果一、题目二、代码classSolution{public://版本1.0:遗憾的是暴力解法失败了//局部最优//除了基本逻辑我觉得一轮一轮顺着发糖果效率更高不用去找全局最小值//intcandy(vector&ratings)//{//inti,j;//vectorcandys;//intoperation_flag=1;//intreturn_num=0;//if
@白圭
·
2023-11-30 17:54
#
leetcode
算法
c++
力扣
刷题记录
-- JAVA---87--135. 分发糖果
目录一、题目二、代码三、运行结果一、题目二、代码classSolution{publicintcandy(int[]ratings){//左一遍右一遍inti;intlength=ratings.length;int[]candy=newint[length];intsum=0;for(i=0;iratings[i-1]){candy[i]=Math.max(candy[i],candy[i-1]
@白圭
·
2023-11-30 17:54
#
leetcode
java
算法
Leetcode刷题-312 :戳气球
刷题记录
1.题目介绍:2.题目分析:2.1穷举不可行2.2区间层次的动态规划3.题目解答:1.题目介绍:有n个气球,编号为0到n-1,每个气球上都标有一个数字,这些数字存在数组nums中。
ITSOK_U
·
2023-11-30 11:21
leetcode刷题记录
leetcode
力扣
刷题记录
-- JAVA--30--142. 环形链表 II
目录一、题目二、代码三、运行结果一、题目二、代码/***Definitionforsingly-linkedlist.*classListNode{*intval;*ListNodenext;*ListNode(intx){*val=x;*next=null;*}*}*/publicclassSolution{publicListNodedetectCycle(ListNodehead){if(h
@白圭
·
2023-11-29 17:58
#
leetcode
java
链表
力扣
刷题记录
-- JAVA--26---142. 环形链表 II
目录一、题目二、代码三、运行结果一、题目二、代码/***Definitionforsingly-linkedlist.*classListNode{*intval;*ListNodenext;*ListNode(intx){*val=x;*next=null;*}*}*/publicclassSolution{publicListNodedetectCycle(ListNodehead){List
@白圭
·
2023-11-29 17:58
#
leetcode
java
链表
牛客剑指offer
刷题记录
(四)
包含min函数的栈最小栈问题,这里需要在class中维护两个栈,一个栈用于正常的push、pop、top操作,另一个栈就是维护当前最小值的栈。具体做法是,假设现在s2是最小栈,栈顶元素时当前最小值,此时push一个新的值value过来,我们判断,如果value比最小栈的栈顶元素小,那么,需要将value作为新的最小值push到栈中,否则的话则把当前最小值作为本次插入之后的最小值再push一次,即:
NearXDU
·
2023-11-29 00:04
笔试面试
剑指offer
刷题记录
第三十三天-反转字符串和反转字符串II
反转字符串#includeusingnamespacestd;intmain(){stringstr="hello";intleft=0,right=str.size()-1;while(left
onlyzzr
·
2023-11-28 23:04
每日一题
算法
c++
数据结构
刷题记录
第三十四天-反转字符串中的单词
classSolution{public:stringreverseWords(strings){intslow=0;for(intfast=0;fast
onlyzzr
·
2023-11-28 23:04
每日一题
java
算法
数据结构
刷题记录
第三十二天-二叉树的层序遍历
classSolution{public:vector>levelOrder(TreeNode*root){queueque;que.push(root);vector>result;while(!que.empty()){intn=que.size();vectornum{};for(inti=0;ival);que.push(current->left);que.push(current->r
onlyzzr
·
2023-11-28 23:34
每日一题
算法
数据结构
刷题记录
第三十五天-(KMP算法)找出字符串中的第一个匹配项的下标
KMP算法真是刷一次忘一次#includeusingnamespacestd;voidget_next(vector&next,strings){intj=0;next[0]=0;for(inti=1;i0&&s[i]!=s[j]){j=next[j-1];}if(s[i]==s[j])j++;next[i]=j;}}intfind(stringhaystack,stringneedle){vec
onlyzzr
·
2023-11-28 23:03
每日一题
算法
上一页
1
2
3
4
5
6
7
8
下一页
按字母分类:
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
其他