实现strStr
力扣 28. 实现 strStr()题目说明
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
注意:
本题中的空白字符只包括空格字符 ' ' 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
提示:
0 <= haystack.length, needle.length <= 5 * 104
haystack 和 needle 仅由小写英文字符组成
示例例112输入:haystack = "hello", needle = "ll"输出:2
例212输入:haystack = "aa ...
移除元素
力扣 27. 移除元素题目说明
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
12345678// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝int len = removeElement(nums, val);// 在函数里修改输入数组对于调用者是可见的。// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。for (int i = 0; i < len; i++) { print(nums[i]);}
提示:
0 <= nums.length <= 100
0 <= nums[i] <= 50
...
字符串转换整数
力扣 8. 字符串转换整数 (atoi)题目说明请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。
函数 myAtoi(string s) 的算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,”123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−2∧31, 2∧31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2∧31 的整数应该被固定为 −2∧31 ,大于 2∧31 − 1 的整数应该被固定为 2∧31 − 1 。
返回整数作为最终结果。
注意:
本题中的空白字符只包括空格字符 ...
打家劫舍II
力扣 213. 打家劫舍 II题目说明你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 1000
示例例1123输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
例21234输入:nums = [1,2,3,1]输出:4解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。
例312输入:nums = [0]输出:0
笔者理解此题是一道动态规划算法问题,在力扣题库中被定义为中等题。 ...
Trie[前缀树]
力扣 208. 实现 Trie (前缀树)题目说明Trie**(发音类似 “try”)或者说 **前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 Trie 类:
Trie() 初始化前缀树对象。
void insert(String word) 向前缀树中插入字符串 word 。
boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
提示:
1 <= word.length, prefix.length <= 2000
word 和 prefix 仅由小写英文字母组成
insert、search 和 startsWith 调用次数 总计 不超过 3 * 104 次
示例例112345678 ...
二叉搜索树节点最小距离
力扣 783. 二叉搜索树节点最小距离题目说明给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
注意:本题与 530:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/ 相同
提示:
树中节点数目在范围 [2, 100] 内
0 <= Node.val <= 105
示例例1
12输入:root = [4,2,6,1,3]输出:1
例2
12输入:root = [1,0,48,null,null,12,49]输出:1
笔者理解此题是一道二叉树算法问题,在力扣题库中被定义为简单题。
解法当笔者阅读完此题后,发现此题就是针对于二叉搜索树的性质的一次运用,二叉搜索树的中序遍历是有序的,而所有节点的最小差值又必定等于两两相近之数之差,所以我们可以在对二叉搜索树进行中序遍历中将最小差值求出来,让我们来看看具体如何实现的吧。
实现12345678910111213141516171819202122232425262728class Solutio ...
丑数
力扣 263. 丑数题目说明给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。
丑数 就是只包含质因数 2、3 和/或 5 的正整数。
提示:
-231 <= n <= 231 - 1
示例例1123输入:n = 6输出:true解释:6 = 2 × 3
例2123输入:n = 14输出:false解释:14 不是丑数,因为它包含了另外一个质因数 7 。
例3123输入:n = 1输出:true解释:1 通常被视为丑数。
笔者理解此题是一道数学算法问题,在力扣题库中被定义为简单题。
解法当笔者阅读完此题后,发现此题没有太多技巧,直接进行化解因子即可,让我们来看看具体如何实现的吧。
实现123456789101112131415public boolean isUgly(int num) { if (num < 1) { return false; } // 直接将num进行化解因子操作,除去2,3,5剩下的数如果不为1即为非丑数 ...
寻找旋转排序数组中的最小值II
力扣 154. 寻找旋转排序数组中的最小值 II题目说明已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:
若旋转 4 次,则可以得到 [4,5,6,7,0,1,4]
若旋转 7 次,则可以得到 [0,1,4,4,5,6,7]
注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
给你一个可能存在 重复 元素值的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。
提示:
n == nums.length
1 <= n <= 5000
-5000 <= nums[i] <= 5000
nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转
示例例112输入:nums = [1,3,5]输出:1
例212输入:nums = [2,2,2, ...
删除有序数组中的重复项II
力扣 80. 删除有序数组中的重复项 II题目说明给你一个有序数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
12345678// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝int len = removeDuplicates(nums);// 在函数里修改输入数组对于调用者是可见的。// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。for (int i = 0; i < len; i++) { print(nums[i]);}
提示:
0 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按升序 ...
森林中的兔子
力扣 781. 森林中的兔子题目说明森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。
返回森林中兔子的最少数量。
提示:
answers 的长度最大为1000。
answers[i] 是在 [0, 999] 范围内的整数。
示例例1123456789示例:输入: answers = [1, 1, 2]输出: 5解释:两只回答了 "1" 的兔子可能有相同的颜色,设为红色。之后回答了 "2" 的兔子不会是红色,否则他们的回答会相互矛盾。设回答了 "2" 的兔子为蓝色。此外,森林中还应有另外 2 只蓝色兔子的回答没有包含在数组中。因此森林中兔子的最少数量是 5: 3 只回答的和 2 只没有回答的。
例212输入: answers = [10, 10, 10]输出: 11
例312输入: answers = []输出: 0
笔者理解此题是一道数学算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,发现此题用上哈希 ...




![Trie[前缀树]](https://i.loli.net/2020/12/17/ywnRKDrhGjCeEao.png)




