[toc]
快排
递归实现
1 | class Solution { |
非递归实现
1 | class Solution{ |
归并排序
1 | class Solution { |
堆排序
1 | class Solution { |
二叉树的先序、中序、后序遍历
题目描述
分别按照二叉树先序,中序和后序打印所有的节点。
示例1
输入
1 | {1,2,3} |
返回值
1 | [[1,2,3],[2,1,3],[2,3,1]] |
备注:
$n \leq 10^6$
1 | import java.util.*; |
多线程售票
1 | package test; |
多线程交替打印
LockSupport实现
1 | public class PrintABC { |
1 | ABCABCABCABCABCABCABCABCABCABC |
Lock搭配Condition实现
1 | public class PrintABC { |
1 | ABCABCABCABCABCABCABCABCABCABC |
Semaphore 实现
1 | public class PrintABC { |
1 | ABCABCABCABCABCABCABCABCABCABC |
synchronized实现
1 | public class PrintABC { |
反转链表
题目描述
输入一个链表,反转链表后,输出新链表的表头。
示例1
输入
1 | {1,2,3} |
返回值
1 | {3,2,1} |
解法
1 | public class Solution { |
链表中的节点每k个一组反转
1 | import java.util.*; |
设计LRU的缓存结构
题目描述
设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能
- set(key, value):将记录(key, value)插入该结构
- get(key):返回key对应的value值
[要求]
- set和get方法的时间复杂度为O(1)
- 某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。
- 当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。
若opt=1,接下来两个整数x, y,表示set(x, y)
若opt=2,接下来一个整数x,表示get(x),若x未出现过或已被移除,则返回-1
对于每个操作2,输出一个答案
示例1
输入
1 | [[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3 |
返回值
1 | [1,-1] |
说明
1 | 第一次操作后:最常使用的记录为("1", 1) |
备注:
$1 \leq K \leq N \leq 10^5$
$-2 \times 10^9 \leq x,y \leq 2 \times 10^9$
1 | import java.util.*; |
继承写法
1 | import java.util.*; |
460. LFU 缓存
请你为 最不经常使用(LFU)缓存算法设计并实现数据结构。
实现 LFUCache
类:
LFUCache(int capacity)
- 用数据结构的容量capacity
初始化对象int get(int key)
- 如果键存在于缓存中,则获取键的值,否则返回 -1。void put(int key, int value)
- 如果键已存在,则变更其值;如果键不存在,请插入键值对。当缓存达到其容量时,则应该在插入新项之前,使最不经常使用的项无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,应该去除 最近最久未使用 的键。
注意「项的使用次数」就是自插入该项以来对其调用 get
和 put
函数的次数之和。使用次数会在对应项被移除后置为 0 。
为了确定最不常使用的键,可以为缓存中的每个键维护一个 使用计数器 。使用计数最小的键是最久未使用的键。
当一个键首次插入到缓存中时,它的使用计数器被设置为 1
(由于 put 操作)。对缓存中的键执行 get
或 put
操作,使用计数器的值将会递增。
示例:
1 | 输入: |
提示:
0 <= capacity, key, value <= 104
- 最多调用
105
次get
和put
方法
进阶:你可以为这两种操作设计时间复杂度为 O(1)
的实现吗?
解题思路
使用TreeSet保存Node的顺序,使用HashMap保存当前键值对的映射。
创建Node实现comparable接口,实现compareTo方法
1 | class LFUCache { |
最小的K个数
题目描述
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组
示例1
输入
1 | [4,5,1,6,2,7,3,8],4 |
返回值
1 | [1,2,3,4] |
堆(大根堆是从小到大排序,小根堆是从大到小排序)
1 | import java.util.*; |
两数之和
题目描述
给出一个整数数组,请在数组中找出两个加起来等于目标值的数,
你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的
假设给出的数组中只存在唯一解
例如:
给出的数组为 {20, 70, 110, 150},目标值为90
输出 index1=1, index2=2
示例1
输入
1 | [3,2,4],6 |
返回值
1 | [2,3] |
使用HashMap加速
1 | import java.util.*; |
三数之和
题目描述
给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。
注意:
- 三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)
- 解集中不能包含重复的三元组。
1 | 例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, 0, 10) (-10, -10, 20) |
示例1
输入
1 | [-2,0,1,1,2] |
返回值
1 | [[-2,0,2],[-2,1,1]] |
循环+双指针
1 | import java.util.*; |
最长无重复子串
题目描述
给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。
示例1
输入
1 | [2,3,4,5] |
返回值
1 | 4 |
示例2
输入
1 | [2,2,3,4,3] |
返回值
1 | 3 |
备注:
$1 \leq n \leq 10^5$
滑动窗口+集合检测是否重复
1 | public class Solution { |
括号序列
题目描述
给出一个仅包含字符’(‘,’)’,’{‘,’}’,’[‘和’]’,的字符串,判断给出的字符串是否是合法的括号序列
括号必须以正确的顺序关闭,”()”和”()[]{}”都是合法的括号序列,但”(]”和”([)]”不合法。
示例1
输入
1 | "[" |
返回值
1 | false |
示例2
输入
1 | "[]" |
返回值
1 | true |
栈
如果栈为空入栈
遇到左括号就入栈
遇到右括号查看栈顶元素是不是与当前的右括号匹配,如果匹配出栈
结束时判断当前栈是否为空,为空则匹配,如果不为空,那么不匹配
1 | import java.util.*; |
含有重复元素的二分查找
题目描述
请实现有重复数字的升序数组的二分查找
给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
示例1
输入
1 | [1,2,4,4,5],4 |
返回值
1 | 2 |
说明
1 | 从左到右,查找到第1个为4的,下标为2,返回2 |
示例2
输入
1 | [1,2,4,4,5],3 |
返回值
1 | -1 |
示例3
输入
1 | [1,1,1,1,1],1 |
返回值
1 | 0 |
含有重复值的二分查找的过程中,要想获得第一个数字的index,就要在找到元素后继续搜索左半部分,这样才能找到第一个(注意,如果这样做需要判断当前的左边界是不是大于了数组的长度,如果大于数组的长度,那么不存在当前的元素)
1 | import java.util.*; |
最长回文子串
题目描述
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
示例1
输入
1 | "abc1234321ab",12 |
返回值
1 | 7 |
动态规划
- 枚举子串串的第一个字符的index以及子串的长度
- 当子串的长度为1的时候那么子串是回文的
- 当子串的长度为2的时候,如果子串的两个字符相同,那么子串是回文的
- 当子串的长度大于2的时候,如果子串的当前字符相同并且子串的内部是回文的,那么该子串是回文的。
1 | import java.util.*; |
数组中出现次数超过一半的数字
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
示例1
输入
1 | [1,2,3,2,2,2,5,4,2] |
返回值
1 | 2 |
摩尔投票
- 设置最多的那个数为数组的第一个数字
- 如果当前的数字与最多的数字相同,那么计数器+1
- 如果当前的数字与最多的数字不同:
- 计数器大于0,那么计数器-1
- 如果计数器不大于0,那么将当前的数字设置为most,计数器设置为1
重新遍历一次查看当前的数字的数量是不是大于数组长度的一半
1 | public class Solution { |
编辑距离(记录编辑过程)
难度困难1565
给你两个单词 word1
和 word2
,请你计算出将 word1
转换成 word2
所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
示例 1:
1 | 输入:word1 = "horse", word2 = "ros" |
示例 2:
1 | 输入:word1 = "intention", word2 = "execution" |
提示:
0 <= word1.length, word2.length <= 500
word1
和word2
由小写英文字母组成
1 | public class EditDistancePro { |
子数组最大累加和
题目描述
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
题目保证没有全为负数的数据
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)
示例1
输入
1 | [1, -2, 3, 5, -2, 6, -1] |
返回值
1 | 12 |
备注:
$1 \leq N \leq 10^5$
$|arr_i| \leq 100$
1 | import java.util.*; |
最长公共子序列(返回序列)
题目描述
给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则输出-1。
示例1
输入
1 | "1A2C3D4B56","B1D23CA45B6A" |
返回值
1 | "123456" |
说明
1 | "123456"和“12C4B6”都是最长公共子序列,任意输出一个。 |
备注:
$1 \leq |str_1|, |str_2| \leq 5,0001≤∣str1∣,∣str2∣≤5000$
1 |
|
最长公共子串
题目描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串
题目保证str1和str2的最长公共子串存在且唯一。
示例1
输入
1 | "1AB2345CD","12345EF" |
返回值
1 | "2345" |
备注:
1 | 1 \leq |str_1|, |str_2| \leq 5\,0001≤∣str1∣,∣str2∣≤5000 |
1 | import java.util.*; |
二叉树的最近公共祖先
题目描述
给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
示例1
输入
1 | [3,5,1,6,2,0,8,#,#,7,4],5,1 |
返回值
1 | 3 |
递归
思路:
- 只要是左子树或右子树返回的值不为空,说明在左子树或者右子树上
- 如果左右子树都不为空,说明当前的根节点是公共祖先,返回当前的节点
1 | import java.util.*; |
判断一颗二叉树是否为二叉搜索树和完全二叉树
题目描述
给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。
示例1
输入
{2,1,3}
返回值
[true,true]
备注:
$n \leq 500000n≤500000$
判断是否是二叉搜索树:
- 使用中序遍历,如果当前遍历到的元素小于等于前一个元素,那么不是二叉搜索树,否则是二叉搜索树
判断是否是完全二叉树
- 使用层序遍历,如果遍历到某个元素为空,那么它后面的所有的节点都是空的,如果不为空,说明不是完全二叉树
1 | import java.util.*; |
二叉树的之字形层序遍历
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
例如:
给定的二叉树是{3,9,20,#,#,15,7},
该二叉树之字形层序遍历的结果是
[
[3],
[20,9],
[15,7]
]
示例1
输入
1 | {1,#,2} |
返回值
1 | [[1],[2]] |
使用双端链表保存结果(头插和尾插)
- 如果当前的层数是奇数的时候从头插入
- 如果当前的层数是偶数的时候从尾插入
1 | import java.util.*; |
二叉树根节点到叶子节点和为指定值的路径
描述
给定一个二叉树和一个值 sum
,请找出所有的根节点到叶子节点的节点值之和等于sum
的路径,
例如:
给出如下的二叉树,sum=22
,
返回
[
[5,4,11,2],
[5,8,9]
]
示例1
输入:
1 | {1,2},1 |
返回值:
1 | [] |
示例2
输入:
1 | {1,2},3 |
返回值:
1 | [[1,2]] |
1 | import java.util.*; |
字符串变形
题目描述
对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格,就像”Hello World”一样,然后我们要做的是把着个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。比如”Hello World”变形后就变成了”wORLD hELLO”。
输入描述:
给定一个字符串s以及它的长度n(1≤n≤500)
返回值描述:
请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。
示例1
输入
"This is a sample",16
返回值
"SAMPLE A IS tHIS"
使用一个StringBuilder来保存当前的单词,
- 如果是小写字母变成大写,
- 如果是大写字母变成小写,
- 否则当前字符是空格,将当前StringBuilder中的元素转换成字符串,前面加上一个空格,放到res的前面,清空当前的StringBuilder
1 | import java.util.*; |
大数加法
题目描述
以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。
(字符串长度不大于100000,保证字符串仅由’0’~’9’这10种字符组成)
示例1
输入
1 | "1","99" |
返回值
1 | "100" |
说明
1 | 1+99=100 |
1 | import java.util.*; |
链表中环的入口点
题目描述
对于一个给定的链表,返回环的入口节点,如果没有环,返回null
拓展:
你能给出不利用额外空间的解法么?
解题思路:
使用快慢指针,快指针一次走两步,慢指针一次走一步,如果快指针和慢指针相遇,那么从头结点再出发一个慢指针,两个慢指针再次相遇的位置即为环的入口节点。
1 | public class Solution { |
矩阵的最小路径和
题目描述
给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。
示例1
输入
1 | [[1,3,5,9] |
返回值
1 | 12 |
备注:
$1 \leq n,m \leq 2000$
$1 \leq arr_{i,j} \leq 100$
动态规划
- 对于矩阵左边界和上边界上的点,只有一条路径转移方程为
dp[i][0] = dp[i-1][j]+matrix[i][0];
dp[0][j] = dp[i][j-1]+matrix[0][j];
- 对于非矩阵左边界和上边界上的点,可以通过上面和左边转移而来,转移方程为:
dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1])+matrix[i][j]
1 | import java.util.*; |
合并有序数组
题目描述
给出两个有序的整数数组 和 ,请将数组 合并到数组 中,变成一个有序的数组
注意:
可以假设 数组有足够的空间存放 数组的元素, 和 中初始的元素数目分别为 和
1 | public class Solution { |
链表中的倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点
难度简单182
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6
个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6
。这个链表的倒数第 3
个节点是值为 4
的节点。
示例:
1 | 给定一个链表: 1->2->3->4->5, 和 k = 2. |
1 | /** |
删除链表的倒数第n个节点
题目描述
给定一个链表,删除链表的倒数第 nn 个节点并返回链表的头指针
例如,
给出的链表为: 1\to 2\to 3\to 4\to 51→2→3→4→5, n= 2n=2.
删除了链表的倒数第 nn 个节点之后,链表变为1\to 2\to 3\to 51→2→3→5.
备注:
题目保证 nn 一定是有效的
请给出请给出时间复杂度为\ O(n) O(n) 的算法
示例1
输入
1 | {1,2},2 |
返回值
1 | {2} |
1 | import java.util.*; |
合并两个有序链表
题目描述
将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。
示例1
输入
1 | {1},{2} |
返回值
1 | {1,2} |
示例2
输入
1 | {2},{1} |
返回值
1 | {1,2} |
1 | import java.util.*; |
环形链表的约瑟夫问题
题目描述
编号为 11 到 nn 的 nn 个人围成一圈。从编号为 11 的人开始报数,报到 mm 的人离开。
下一个人继续从 11 开始报数。
n-1n−1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?
示例1
输入
1 | 5,2 |
返回值
1 | 3 |
说明
1 | 开始5个人 1,2,3,4,5 ,从1开始报数,1->1,2->2编号为2的人离开 |
备注:
1 | 1 \leq n, m \leq 100001≤n,m≤10000 |
1 | import java.util.*; |
两个链表的第一个公共节点
先遍历自己的那一条链,自己的遍历完遍历另外的一条链,当两个遍历的节点相等时返回其中一个节点
1 | /* |
第K大的数
题目描述
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
示例1
输入
1 | [1,3,5,2,2],5,3 |
返回值
1 | 2 |
1 | import java.util.*; |
最小的k个数(k个数之间不要求顺序)
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组
示例1
输入
1 | [4,5,1,6,2,7,3,8],4 |
返回值
1 | [1,2,3,4] |
1 | public class Solution { |
最小的k个数(k个数之间要求顺序时最好用堆)
反转数字
题目描述
将给出的32位整数x翻转。
例1:x=123,返回321
例2:x=-123,返回-321
你有注意到翻转后的整数可能溢出吗?因为给出的是32位整数,则其数值范围为[−2^{31}, 2^{31} − 1][−231,231−1]。翻转可能会导致溢出,如果反转后的结果会溢出就返回 0。
示例1
输入
1 | -123 |
返回值
1 | -321 |
1 | import java.util.*; |
最长递增子序列
题目描述
给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的)
示例1
输入
1 | [2,1,5,3,6,4,8,9,7] |
返回值
1 | [1,3,4,8,9] |
示例2
输入
1 | [1,2,8,6,4] |
返回值
1 | [1,2,4] |
说明
1 | 其最长递增子序列有3个,(1,2,8)、(1,2,6)、(1,2,4)其中第三个字典序最小,故答案为(1,2,4) |
备注:
$n \leq 10^5$
$1 \leq arr_i \leq 10^9$
1 |
|
合并区间
题目描述
给出一组区间,请合并所有重叠的区间。
请保证合并后的区间按区间起点升序排列。
示例1
输入
1 | [[10,30],[20,60],[80,100],[150,180]] |
返回值
1 | [[10,60],[80,100],[150,180]] |
1 | import java.util.*; |
验证IP地址
题目描述
编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址
IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(“.”)分割。比如,172.16.254.1;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。
IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (“:”)分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。
然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (::) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。
说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。
示例1
输入
1 | "172.16.254.1" |
返回值
1 | "IPv4" |
说明
1 | 这是一个有效的 IPv4 地址, 所以返回 "IPv4" |
示例2
输入
1 | "2001:0db8:85a3:0:0:8A2E:0370:7334" |
返回值
1 | "IPv6" |
说明
1 | 这是一个有效的 IPv6 地址, 所以返回 "IPv6" |
示例3
输入
1 | "256.256.256.256" |
返回值
1 | "Neither" |
说明
1 | 这个地址既不是 IPv4 也不是 IPv6 地址 |
备注:
1 | ip地址的类型,可能为 |
1 | import java.util.*; |
接雨水问题
题目描述
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。
示例1
输入
1 | [3,1,2,5,2,4] |
返回值
1 | 5 |
示例2
输入
1 | [4,5,1,3,2] |
返回值
1 | 2 |
备注:
1 | 1 \leq N \leq 10^61≤N≤106 |
1 | import java.util.*; |
正则表达式匹配
剑指 Offer 19. 正则表达式匹配
难度困难221
请实现一个函数用来匹配包含'. '
和'*'
的正则表达式。模式中的字符'.'
表示任意一个字符,而'*'
表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"
与模式"a.a"
和"ab*ac*a"
匹配,但与"aa.a"
和"ab*a"
均不匹配。
示例 1:
1 | 输入: |
示例 2:
1 | 输入: |
示例 3:
1 | 输入: |
示例 4:
1 | 输入: |
示例 5:
1 | 输入: |
s
可能为空,且只包含从a-z
的小写字母。p
可能为空,且只包含从a-z
的小写字母以及字符.
和*
,无连续的'*'
。
注意:本题与主站 10 题相同:https://leetcode-cn.com/problems/regular-expression-matching/
1 | class Solution { |
最长公共前缀
题目描述
编写一个函数来查找字符串数组中的最长公共前缀。
示例1
输入
1 | ["abca","abc","abca","abc","abcc"] |
返回值
1 | "abc" |
字典树写法
1 | import java.util.*; |
横向扫描
1 | class Solution { |
删除链表中重复出现的元素
题目描述
给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1 \to 2\to 3\to 3\to 4\to 4\to51→2→3→3→4→4→5, 返回1\to 2\to51→2→5.
给出的链表为1\to1 \to 1\to 2 \to 31→1→1→2→3, 返回2\to 32→3.
示例1
输入
1 | {1,2,2} |
返回值
1 | {1} |
使用虚节点
1 | import java.util.*; |
两个栈实现队列
题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
- 入栈时往栈1中插入元素
- 出栈时检查栈2是否为空:
- 如果栈2为空,那么将栈1中的所有元素pop并push到栈2中来,入栈完毕后从栈2出栈
- 如果栈2不为空,那么从栈2出栈
1 | import java.util.Stack; |
数组中只出现一次的数字(其余都出现了k次)
题目描述
给定一个整型数组 arrarr 和一个整数 k(k>1)。
已知 arr 中只有 1 个数出现一次,其他的数都出现 k 次。
请返回只出现了 1 次的数。
示例1
输入
1 | [5,4,1,1,5,1,5],3 |
返回值
1 | 4 |
1 | import java.util.*; |
阶乘后的0
难度简单456收藏分享切换为英文接收动态反馈
给定一个整数 n,返回 n! 结果尾数中零的数量。
示例 1:
1 | 输入: 3 |
示例 2:
1 | 输入: 5 |
说明: 你算法的时间复杂度应为 O(log n) 。
1 | class Solution { |
表达式求值
给定一个表达式,其中运算符仅包含 +,-,*,/
(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。
1 | import java.util.*; |
螺旋矩阵
题目描述
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
示例1
输入
1 | [[1,2,3],[4,5,6],[7,8,9]] |
返回值
1 | [1,2,3,6,9,8,7,4,5] |
优雅写法
1 | import java.util.*; |
生成丑数
难度:中等
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例:
1 | 输入: n = 10 |
说明:
1
是丑数。n
不超过1690。
注意:本题与主站 264 题相同:https://leetcode-cn.com/problems/ugly-number-ii/
1 | public class Solution { |
剑指 Offer 51. 数组中的逆序对
难度困难405
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例 1:
1 | 输入: [7,5,6,4] |
限制:
1 | 0 <= 数组长度 <= 50000 |
1 | 来源:力扣(LeetCode) |
归并排序
1 | class Solution { |
字符串转化为数字
实现函数 atoi 。函数的功能为将字符串转化为整数
提示:仔细思考所有可能的输入情况。这个问题没有给出输入的限制,你需要自己考虑所有可能的情况。
示例1
输入
1 | "123" |
返回值
1 | 123 |
输入
1 | "123a4" |
返回值
1 | 123 |
1 | import java.util.*; |
43. 字符串相乘(大数乘法)
难度中等631
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
示例 1:
1 | 输入: num1 = "2", num2 = "3" |
示例 2:
1 | 输入: num1 = "123", num2 = "456" |
说明:
num1
和num2
的长度小于110。num1
和num2
只包含数字0-9
。num1
和num2
均不以零开头,除非是数字 0 本身。- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
优雅写法
1 | public String multiply(String num1, String num2) { |
KMP算法
题目描述
给你一个非空模板串S,一个文本串T,问S在T中出现了多少次
示例1
输入
"ababab","abababab"
返回值
2
示例2
输入
"abab","abacabab"
返回值1
备注:
空间O(n)时间O(n)的算法
1 | import java.util.*; |