0026题 删除排序数组中的重复项【Remove Duplicates from Sorted Array】
题目:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
题目相对严谨
需要注意:
1. 理解题目意思(使用Python的新手可能稍难理解,因为这里面涉及到一些调用关系)
2. 输入数据有一组空List,注意Robust
3. Python如果使用remove函数的话,小心下标越界
简单题目,无需post代码
0027题 移除元素【Remove Element】
题目:
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
注意这五个元素可为任意顺序。
你不需要考虑数组中超出新长度后面的元素。
题目相对严谨
需要注意的点和上一道题完全相同
简单题目,无需post代码
0028题 实现strStr()【Implement strStr()】
题目:
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
示例:
输入: haystack = "hello", needle = "ll"
输出: 2
输入: haystack = "aaaaa", needle = "bba"
输出: -1
题目相对严谨
需要注意:
1. 因为这道题是要实现寻找这一函数,所以不应使用额外任何辅助函数,像是python中的find之类的或者切片,皆属于非法操作。
解题思路:
这是一道经典的字符串匹配题目,KMP算法直接解决,另外还有很多算法如BM、Sunday也可以解决此类问题,先不在这里赘述,如果后续遇到相关题目,可以换另外一种算法。
这是第一次用Python编写KMP算法,故把代码post在这里:
class Solution:
def __init__(self):
self.nxt = []
def makeNext(self, m, needle):
k = 0
for i in range(1,m):
while k > 0 and needle[i] != needle[k]:
k = self.nxt[k-1]
if needle[i] == needle[k]:
k += 1
self.nxt[i] = k
def strStr(self, haystack, needle):
n = len(haystack)
m = len(needle)
if m == 0: return 0
self.nxt = [0]*m
self.makeNext(m, needle)
q = 0
for i in range(n):
while q > 0 and needle[q] != haystack[i]:
q = self.nxt[q-1]
if needle[q] == haystack[i]:
q += 1
if q == m:
return i-m+1
return -1
0029题 两数相除【Divide Two Integers】
题目:
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
说明:
- 被除数和除数均为 32 位有符号整数。
- 除数不为 0。
- 假设我们的环境只能存储 32 位有符号整数,其数值范围是 。本题中,如果除法结果溢出,则返回 。
示例:
输入: dividend = 10, divisor = 3
输出: 3
输入: dividend = 7, divisor = -3
输出: -2
题目相对严谨
无需注意太多
解题思路:
1. 暴力破解
2. 采用
的优化方法,用位运算(又没说不让用这个吧╮(╯▽╰)╭)达到二分的目标,无非就是在不使用除号和模号的情况下,使用全部其他的运算符嘛……哼,还不知道其他运算符有没有使用除号呢。
思路相对简单题目,无需post代码
0031题 下一个排列【Next Permutation】
题目:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
示例:
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
题目相对严谨
需要注意:
1. 如果只有一个数或者没有数的话,则无需处理(该死的Robust!【现在面试是这样的(划掉
2. Python要额外小心并熟练slicing的赋值和使用
解题思路:
一开始还以为要打表来着,后来想着不用只要从后往前扫描,
可以解决,主要考察break的熟练度。
真佩服Leetcode的OJ系统,emmm,感觉很奇妙,下次尝试一下弄爆【手动托腮
(下一期开头会补上0010、0013、0024题的Python代码,以及0025题的解答)