Leetcode题解 0009期

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 位有符号整数,其数值范围是 [ 2 31 , 2 31 1 ] 。本题中,如果除法结果溢出,则返回 2 31 1

示例:

输入: dividend = 10, divisor = 3
输出: 3

输入: dividend = 7, divisor = -3
输出: -2

题目相对严谨

无需注意太多

解题思路:
1. 暴力破解
2. 采用 O ( l o g n ) 的优化方法,用位运算(又没说不让用这个吧╮(╯▽╰)╭)达到二分的目标,无非就是在不使用除号和模号的情况下,使用全部其他的运算符嘛……哼,还不知道其他运算符有没有使用除号呢。

思路相对简单题目,无需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的赋值和使用

解题思路:
一开始还以为要打表来着,后来想着不用只要从后往前扫描, O ( n ) 可以解决,主要考察break的熟练度。

真佩服Leetcode的OJ系统,emmm,感觉很奇妙,下次尝试一下弄爆【手动托腮

(下一期开头会补上0010、0013、0024题的Python代码,以及0025题的解答)

猜你喜欢

转载自blog.csdn.net/bright_silmarillion/article/details/80628966