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
-软件工程随想录
《系统架构设计师教程(第2版)》第5章-
软件工程
基础知识-06-基于构件的
软件工程
(CBSE)
1.2.3容器理论2.CBSE过程2.1主要活动包括2.2与传统的软件开发过程的不同3.构件组装3.1组装方式1)顺序组装2)层次组装3)叠加组装3.2构件不兼容1)构件不兼容的情况2)解决方法基于构件的
软件工程
玄德公笔记
·
2024-02-28 19:02
#
软考架构师笔记
系统架构
软件工程
系统架构设计师教程
第2版
清华版
基于构建的软件工程
二刷代码
随想录
算法训练营第七天 |454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
目录一、454.四数相加II二、383.赎金信三、15.三数之和18.四数之和一、454.四数相加II题目链接:力扣文章讲解:代码
随想录
视频讲解:学透哈希表,map使用有技巧!
magic bamboo
·
2024-02-28 11:23
算法
leetcode
哈希算法
设计模式:设计模式概述
1.设计模式概述1.1什么是设计模式设计模式是在
软件工程
中常见的解决特定问题的可复用解决方案。
星光闪闪k
·
2024-02-28 00:07
Java
设计模式
设计模式
java
数据库
后端
架构
代码
随想录
算法训练营第60天(动态规划17● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇
动态规划part17647.回文子串解题思路动态规划解法中心拓展法516.最长回文子序列解题思路动态规划总结篇647.回文子串动态规划解决的经典题目,如果没接触过的话,别硬想直接看题解。题目链接:647.回文子串文章/视频讲解:647.回文子串解题思路动态规划解法dp数组及其下标的含义布尔类型的dp[i][j]:表示区间范围[i,j](注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为
芋泥肉松脑袋
·
2024-02-27 22:04
算法
动态规划
java
leetcode
开发语言
软件报价
10-20万一种(私有化部署)第3方服务费:比如国税总局(2w,5w次数)硬件:扫描枪、扫描仪、服务器、GPU服务器*按服务报价(基于产品):每年收取多少服务费**报价单:注明软件功能点、和报价细节(
软件工程
楼船夜雪_WL
·
2024-02-27 19:48
Java面试八股文
Java基础、Java集合框架、Java并发编程、JVM、Spring、Redis、MyBatis、MySQL、操作系统、计算机网络、RocketMQ、分布式、微服务|二哥的Java进阶之路3.算法代码
随想录
配套
翁正存
·
2024-02-26 05:16
java
代码
随想录
算法训练营第六天|242.有效的字母异位词、349.两个数组的交集、202.快乐数、1.两数之和
文档讲解哈希表哈希碰撞STL当遇到需要查询一个集合中是否出现过某个元素的时候,通常会想到哈希表这种数据结构。那么什么是哈希表呢?存储位置=hash_fun(key),其与数组和链表这种结构都是不同的,它的存储位置是通过一个哈希函数来得到的。哈希函数:h(key)=key%capacity;那如果这个key是负数呢?h(key)就是#includeconstintN=题目数据量*2+3;consti
y_wang09
·
2024-02-26 00:38
算法
链表
哈希算法
代码
随想录
训练营第六十天打卡|647. 回文子串 516.最长回文子序列
647.回文子串1.动规,布尔类型的dp[i][j]:表示区间范围[i,j](注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。本题的dp定义非常不好想,只能说第一次见到后把它当成一个套路记住。另外本题的遍历顺序也是有讲究的,这里提供一个遍历顺序的思路:观察状态转移方程,看看当前状态是由之前的哪些状态转移而来。例如本题情况三:下标:i与j相差大于1的时候,例
孤单的大尾巴狼
·
2024-02-25 08:16
算法
leetcode
动态规划
如何实现零基础转行做测试开发,入职3个月后涨薪30%
本人本科所学专业是统计学,毕业后从事数据分析相关工作,然而,在工作的过程中,我对编码产生了浓厚的兴趣,对编程的热爱驱使我最终决定转行,并成功考取了
软件工程
的非全日制研究生。
·
2024-02-25 03:06
代码
随想录
算法训练营day39| 62. 不同路径、63. 不同路径II
62、不同路径:classSolution(object):defuniquePaths(self,m,n):""":typem:int:typen:int:rtype:int"""dp=[[0]*nfor_inrange(m)]foriinrange(m):dp[i][0]=1forjinrange(n):dp[0][j]=1foriinrange(1,m):forjinrange(1,n):d
牛奶是只猫
·
2024-02-24 03:48
算法
leetcode
数据结构
代码
随想录
算法训练营day21|530.二叉搜索树的最小绝对差 、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
530.二叉搜索树的最小绝对差代码
随想录
视频讲解:二叉搜索树中,需要掌握如何双指针遍历!
一只马儿️
·
2024-02-23 07:25
算法
Java8学习笔记之测试Lambda表达式
通常,好的
软件工程
实践一定少不了单元测试,以此来保证程序的行为与预期一致。通过测试用例确保代码中的每个组成部分都实现预期的结果。
夏与清风
·
2024-02-20 23:12
代码
随想录
10.07 || 二叉树 LeetCode 104.二叉树的最大深度、559.N叉树的深度、111.二叉树的最小深度、222完全二叉树的节点个数
104.二叉树的最大深度给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。二叉树相关的题解,一般都有深度优先遍历和广度优先遍历两种解法,在深度优先遍历中,可能存在前序、中序和后序解,前中后序又存在递归解和迭代解,解法丰富,思路很广,看似简单的题目实则“复杂”。classSolution{//后序递归遍历,详细public:intgetdepth
鱼Sun
·
2024-02-20 22:41
算法
深度优先
代码
随想录
10.09 || 二叉树 LeetCode 110.平衡二叉树、257.二叉树的所有路径、404. 左叶子之和
110.平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一课高度平衡的二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。在开始题目之前,需要明确二叉树的深度和高度,是两种不同的概念。二叉树的深度,指根节点到当前节点的最长路径;二叉树的高度,指当前节点到叶子节点的最长路径。所以,在104.二叉树的最大深度中,我们通过求根节点的高度,进而得到二叉树的最大深度,因为
鱼Sun
·
2024-02-20 22:41
算法
leetcode
数据结构
代码
随想录
| Day 53 - LeetCode 1143. 最长公共子序列、LeetCode 1035. 不相交的线、LeetCode 53. 最大子序和
今天是子序列问题的延续,相对都比较简单。重点一方面是要分清楚与dp[i]对应的子序列是否要以nums[i]结尾,另一方面要判断好两种情况各自对应的dp数组值填充方法。第1题(LeetCode1143.最长公共子序列)相比day52中第3题(LeetCode718.最长重复子数组),子序列不再要求是连续的,剩余地方都与其一样。这一变化反映在定义上,dp[i][j]就变成了text1[0:i-1]与t
非社会人士
·
2024-02-20 22:09
代码随想录
leetcode
算法
c++
动态规划
数据结构
代码
随想录
训练营第17天|LeetCode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和
参考代码
随想录
题目一:LeetCode110.平衡二叉树递归法确定递归函数的参数和返回值:参数为根节点,返回值是以当前传入节点为根节点的树的高度。
忆昔z
·
2024-02-20 22:08
代码随想录训练营
leetcode
算法
数据结构
代码
随想录
算法训练营第十七天| LeetCode110.平衡二叉树、LeetCode257. 二叉树的所有路径、LeetCode404.左叶子之和
#LeetCode110.BalancedBinaryTree#LeetCode110.视频讲解:后序遍历求高度,高度判断是否平衡|LeetCode:110.平衡二叉树_哔哩哔哩_bilibili平衡二叉树的定义是:二叉树的每个节点的左右子树的高度之差不超过1.如果计算二叉树的高度用后序遍历,二叉树的深度用前序遍历,原因如下:二叉树的高度:叶子节点所在的层为1,所以是汇总左右孩子情况后+1,返回给
wIridescent-
·
2024-02-20 22:36
算法
代码
随想录
算法训练营(23/5/25)二叉树,LeetCode 110.平衡二叉树,LeetCode.257二叉树的所有的路径,LeetCode 4044.左子树之和
LeetCode110.平衡二叉树这道题是判断高度平衡的二叉树,深度可以从上到下去查,所以需要前序遍历,而高度是只能从到下到上查,只能是后序遍历,要多看看题目,理解透题目的意思LeetCode257二叉树的所有的路径我不是能理解回溯,这道题半懂LeetCode404.左子树之和判断左节点是最重要的
Y加油
·
2024-02-20 22:36
算法
leetcode
职场和发展
代码
随想录
刷题打卡day36
738.单调递增的数字classSolution{public:intmonotoneIncreasingDigits(intn){stringnums=to_string(n);intflag=nums.size();for(inti=nums.size()-1;i>0;i--){if(nums[i-1]>nums[i]){flag=i;nums[i-1]--;}}for(inti=flag;i
MeloHX
·
2024-02-20 20:34
代码随想录刷题打卡记录
算法
java
数据结构
day21 【二叉树】 530.二叉搜索树的最小绝对差 | 501.二叉搜索树中的众数 | 236. 二叉树的最近公共祖先
文章目录530.二叉搜索树的最小绝对差501.二叉搜索树中的众数236.二叉树的最近公共祖先530.二叉搜索树的最小绝对差530.二叉搜索树的最小绝对差|题目链接代码
随想录
|讲解链接题意:给你一棵所有节点为非负值的二叉搜索树
xuwuuu
·
2024-02-20 20:50
【数据结构与算法】秋招必备
leetcode
算法
数据结构
leetcode算法训练十八天|530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,236. 二叉树的最近公共祖先
|LeetCode:530.二叉搜索树的最小绝对差_哔哩哔哩_bilibili学习文档:代码
随想录
(programmercarl.com)学习时间:21:30-22:06记录时间:22:06状态:已听懂
洗菜拉普达
·
2024-02-20 20:20
算法
leetcode
数据结构
【LeetCode+JavaGuide打卡】Day04| 24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点 、160. 链表相交、142.环形链表II
图片来源:代码
随想录
添加虚拟头节点classSolution{publicLi
WhoAmI\
·
2024-02-20 20:18
leetcode
链表
算法
leetcode77组合 剪枝条件详细解释
题目:77.组合-力扣(LeetCode)题解:力扣(LeetCode)官网-全球极客挚爱的技术成长平台思路来自代码
随想录
:带你学透回溯算法-组合问题(对应力扣题目:77.组合)|回溯法精讲!
猫鱼Ω
·
2024-02-20 19:07
leetcode刷题笔记
剪枝
算法
回溯
代码随想录
代码
随想录
算法训练营第16天|● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
104.二叉树的最大深度思路:二叉树求深度:从上往下遍历,前序遍历求高度:从下往上遍历,后序遍历本题的求最大高度和最大深度都一样,高度即深度。以下用后序遍历求深度,每层递归返回左右子树最大的高度加上本身(当前根节点)的高度.代码:intgetdepth(TreeNode*node){if(node==nullptr)return0;intleftdepth=getdepth(node->left)
strive340
·
2024-02-20 18:38
算法
数据结构
代码
随想录
算法训练营第18天|● 513.找树左下角的值● 112. 路径总和 113.路径总和ii● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
513.找树左下角的值思路(递归):题意是找树的最后一行,最左边的值,所以不一定该节点是左孩子,也有可能是右孩子。本题不需要中的处理过程,所以前中后序遍历都可以,因为只需要左右的遍历顺序即可。用一个全局变量MaxDepth记录最大的深度,depth记录当前遍历的层数(所以需要回溯过程)。因为最先递归遍历左边,所以如果当第一次最大深度出现节点,则result一定记录的是最左值,再之后遍历如果最大深度
strive340
·
2024-02-20 18:08
算法
数据结构
代码
随想录
算法训练营第17天|110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和
110.平衡二叉树为什么很多二叉树的题目都用后序遍历?因为左右中,可以把处理该节点放到最后,例如这题,只有得出了左右子树的高度,才能知道以该节点为根的子树是否为平衡二叉树。思路:后序遍历,计算左右子树高度差,若有一颗子树不是平衡二叉树则直接返回-1(一颗子树不平衡,则整颗子树都不平衡),否则是平衡二叉树,返回左右子树最大的一个高度加上根节点的高度。代码:intgethight(TreeNode*n
strive340
·
2024-02-20 18:07
算法
数据结构
代码
随想录
算法训练营第19天|654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树
654.最大二叉树代码思路:构造二叉树一般都用前序遍历,中左右,可以优先处理构造中节点,再递归构造左右子树。题解分步:第一步.找到该数组中最大的元素,并记录其数组下标(方便分割数组),也是切割点。第二步.中,构造该最大值的节点第三步.左,把切割点(不包含切割点)左边的数组传入递归构造左子树第四步.右,切割点右边数组传入递归构造右子树最后,返回其根节点注:分割数组必须遵循循环不变量原则,下面分割区间
strive340
·
2024-02-20 18:05
算法
数据结构
java
视野 | OpenSearch,云厂商的新选择?
王奇顾问
软件工程
师目前从事PaaS中间件服务(Redis/MongoDB/ELK等)开发工作,对NoSQL数据库有深入的研究以及丰富的二次开发经验,热衷对NoSQL数据库领域内的最新技术动态的学习,能够把握行业技术发展趋势
RadonDB
·
2024-02-20 17:02
数据库
搜索引擎
elasticsearch
c编译器学习02:chibicc文档翻译
コンパイラ作成入門”为想了解底层的人准备的C编译器制作入门
[email protected]
作者简介https://www.sigbus.info/植山瑠偉谷歌
软件工程
师我的专业知识涵盖从
御风@户外
·
2024-02-20 16:14
cc
c语言
学习
开发语言
当平台工程遇上DevEx:打造卓越的开发者体验
了解平台工程平台工程是设计和构建工具链和工作流的学科,可在云原生时代为
软件工程
组织
·
2024-02-20 16:28
运维
代码
随想录
算法训练营day17|Leetcode110/257/404
Leetcode257二叉树的所有路径链接:257.二叉树的所有路径-力扣(LeetCode)给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。思路:递归+回溯法这里有两种方法。第一:两层for循环,分别遍历左子树和右子树。特例:如果只有1个root,那么可以直接添加到结果集种[str(root)],注意在添加的过程中要对应上lettcod
yrrej0
·
2024-02-20 15:20
算法
leetcode
职场和发展
python
数据结构
代码
随想录
算法训练营day5
代码
随想录
算法训练营day5来到了我们的哈希表。。。
魏进
·
2024-02-20 15:47
算法
leetcode
哈希算法
代码
随想录
算法训练营day19
题目:654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树参考链接:代码
随想录
654.最大二叉树思路:做过根据中序后序数组构建二叉树后,这题比较容易,只需要找到最大值分割
羊角问蕊
·
2024-02-20 15:17
算法
代码
随想录
算法训练营day20
题目:530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先参考链接:代码
随想录
530.二叉搜索树的最小绝对差思路:我一开始想到的方法是先生成中序序列,然后对相邻两项的差进行计算
羊角问蕊
·
2024-02-20 15:17
算法
代码
随想录
算法训练营day16
题目:104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数参考链接:代码
随想录
104.二叉树的最大深度思路:上次是用层序遍历的思路做过。
羊角问蕊
·
2024-02-20 15:16
算法
数据结构
代码
随想录
算法训练营day18
题目:513.找树左下角的值、路径总和、从中序与后序遍历序列构造二叉树参考链接:代码
随想录
513.找树左下角的值思路:这题首先想到层序遍历,直接记录每一层第一个值,最后即为答案。
羊角问蕊
·
2024-02-20 15:16
算法
数据结构
代码
随想录
算法训练营day07
题目:454.四数相加II、383.赎金信、15.三数之和、18.四数之和参考链接:代码
随想录
454.四数相加II思路:本题和两数之和感觉类似,四个数我第一想到的是将其拆分成a+b和c+d,由于只需要返回次数
羊角问蕊
·
2024-02-20 15:46
算法
哈希算法
代码
随想录
算法训练营day09
题目:28.实现strStr()、459.重复的子字符串参考链接:代码
随想录
28.实现strStr()思路:KMP算法,这个比较复杂,主要是需要理解一个前缀表,即储存模式串needle的最长相等前后缀,
羊角问蕊
·
2024-02-20 15:46
算法
代码
随想录
算法训练营day14
题目:递归遍历、迭代遍历、统一迭代参考链接:代码
随想录
基础知识满二叉树深度为k,节点数为2^k-1,其中k从1开始完全二叉树除了最底层节点未满,其他层节点都满,且最底层节点集中到左边。
羊角问蕊
·
2024-02-20 15:46
算法
平衡二叉树(简单)——代码
随想录
算法训练营Day17
题目链接:110.平衡二叉树题目描述给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例1:输入:root=[3,9,20,null,null,15,7]输出:true示例2:输入:root=[1,2,2,3,3,null,null,4,4]输出:false示例3:输入:root=[]输出:true提示:树中
晴雪月乔
·
2024-02-20 15:42
代码随想录算法训练营
#
LeetCode
二叉树
算法
代码随想录算法训练营
二叉树
代码
随想录
算法训练营day17|110、257、404
110高度:后序深度:前序后序遍历解决问题:确保递归三要素。如果前序遍历,左右还没得到怎么可能先遍历中呢?-1意义是这个树不是平衡257求路径需要前序遍历。递归?回溯?相辅相成的,回溯的过程就在递归的下面。中写到最前面path表示路径添加404后序遍历会好点:判断左右子树的左叶子之和,返回给上一层节点。递归逻辑:终止条件时,我要判断左孩子之和,要从父节点出发,所以当某个节点没有叶子节点时,条件终止
code_the_smart
·
2024-02-20 15:11
数据结构
代码
随想录
算法训练营第三四天 | 柠檬水找零、身高重建队列、最少数量的箭引爆气球
目录柠檬水找零根据身高重建队列用最少数量的箭引爆气球LeetCode860.柠檬水找零LeetCode406.根据身高重建队列LeetCode452.用最少数量的箭引爆气球柠檬水找零在柠檬水摊上,每一杯柠檬水的售价为5美元。顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付5美元、10美元或20美元。你必须给每个顾客正确找零,也就是说净交易是每位顾
SUBURBIA~
·
2024-02-20 15:10
算法
代码
随想录
算法训练营第三七天 | 单调递增的数字、监控二叉树
目录单调递增的数字监控二叉树LeetCode738.单调递增的数字LeetCode968.监控二叉树单调递增的数字当且仅当每个相邻位数上的数字x和y满足xchars[i]的情况,chars[i-1]–;同时设置一个变量记录从第几位开始后面都是9,再写一个for循环遍历设置为9.最后Integer.parseInt(String.valueOf(chars))classSolution{public
SUBURBIA~
·
2024-02-20 15:10
算法
代码
随想录
算法训练营第三三天 | K次取反后最大化数组和、加油站、分发糖果
目录K次取反后最大化的数组和加油站分发糖果LeetCode1005.K次取反后最大化的数组和LeetCode134.加油站LeetCode135.分发糖果K次取反后最大化的数组和局部最优:让绝对值大的负数变为正数,当前数值达到最大。整体最优:整个数组和达到最大。局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大。全局最优:整个数组和达到最大。为了尽可能的减少排序次数,代码如下:排序涉及
SUBURBIA~
·
2024-02-20 15:09
算法
代码
随想录
算法训练营Day17
404.左叶子之和513.找树左下角的值112.路径总和404.左叶子之和力扣题目链接注意是左叶子节点,该节点没有其他子节点classSolution{publicintsumOfLeftLeaves(TreeNoderoot){if(root==null)return0;intlval=sumOfLeftLeaves(root.left);//算左子树的左叶子if(root.left!=null
Nruonan
·
2024-02-20 15:39
算法
算法
代码
随想录
算法训练营第三二天 | 买卖股票、跳跃游戏
目录买卖股票的最佳时机II跳跃游戏跳跃游戏iiLeetCode122.买卖股票的最佳时机IILeetCode55.跳跃游戏LeetCode45.跳跃游戏II买卖股票的最佳时机II只有一只股票!当前只有买股票或者卖股票的操作。最终利润是可以分解的:把利润分解为每天为单位的维度。根据prices可以得到每天的利润序列:(prices[i]-prices[i-1])…(prices[1]-prices[
SUBURBIA~
·
2024-02-20 15:39
算法
游戏
代码
随想录
算法训练营Day1 | 数组p1
文章目录前言一、数组理论基础二、(704.)二分查找区间的影响三、(27.)移除元素1.暴力解法2.双指针法(快慢指针法)前言数组是最基础的几个数据结构之一,要了解并掌握一种数据结构,学习它的存储方式以及逻辑结构。此外,还有两道来自LeetCode的例题,二分查找和移除元素来帮助提升算法能力。一、数组理论基础数组是存储在连续地址空间的同类元素的集合。需要注意的是:①数组下标从0开始;②地址空间连续
Dear_Candy
·
2024-02-20 15:09
算法
代码
随想录
算法训练营day17
题目:110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和参考链接:代码
随想录
110.平衡二叉树思路:首先要搞清楚高度和深度的区别,深度是从上往下数,应该使用前序遍历的思路,而高度是从下往上数
羊角问蕊
·
2024-02-20 15:38
算法
LeetCode刷题计划
LeetCode刷题计划推荐代码
随想录
:https://github.com/youngyangyang04/leetcode-master卡码网练习ACM模式https://kamacoder.com
小豆包的小朋友0217
·
2024-02-20 15:37
leetcode
算法
职场和发展
代码
随想录
算法训练营第三六天 | 无重叠区间、划分字母区间、合并区间
目录无重叠区间划分字母区间合并区间LeetCode435.无重叠区间LeetCode763.划分字母区间LeetCode56.合并区间无重叠区间给定一个区间的集合intervals,其中intervals[i]=[starti,endi]。返回需要移除区间的最小数量,使剩余区间互不重叠。和用最少数量的箭引爆气球很像,唯一的区别是引爆气球记录的是非重叠数量,本题记录的是重叠数量。在ifelse内操作
SUBURBIA~
·
2024-02-20 15:05
算法
哈希算法
散列表
上一页
2
3
4
5
6
7
8
9
下一页
按字母分类:
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
其他