LeetCode刷刷题(二)

作者: 迈阿密小白 | 来源:发表于2018-08-27 16:19 被阅读36次

    继续上一篇文章,继续刷刷题。

    存在重复元素

    这边实际上是两个题目:
    第一个比较简单
    题目描述:
    给定一个整数数组,判断是否存在重复元素。
    如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

    输入: [1,2,3,1]
    输出: true
    答案如下:

    class Solution(object):
        def containsDuplicate(self, nums):
            """
            :type nums: List[int]
            :rtype: bool
            """
            newnums=list(set(nums))
            return sorted(nums) != sorted(newnums)
    

    用到了set去重和sorted排序

    第二题
    题目描述:
    给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。

    输入: nums = [1,2,3,1], k = 3
    输出: true

    一开始的没有读题仔细,以为必须要满足i和j的差为K,增加了难度
    答案如下:

    class Solution(object):
        def containsNearbyDuplicate(self, nums, k):
            """
            :type nums: List[int]
            :type k: int
            :rtype: bool
            """
            length = len(nums)
            dic_num={}
            for i in range(length):
                if nums[i] not in dic_num:
                    dic_num[nums[i]]=i
                else:
                    if i - dic_num[nums[i]] <=k:
                        return True
                    else:
                        dic_num[nums[i]] = i
            return False
    

    新增了一个字段,用来key为 nums[i] 的值,value为 index值,如果已经存在字典中则检查 i和j的差值小于k,则返回true

    字典和列表的读取速度

    期间有一次提答案提示我超时,原因是:

     if nums[i] not in dic_num:
    这一句,我写成了
     if nums[i] not in dic_num.keys():
    

    第二段代码 dic_num.keys()变成了list,python在检索list的时候是比较慢的,第一段代码 dic_num是字典,python在检索字典的时候速度是比较快的
    总的来说就是:
    字典生成慢,查找快。 列表生成快,查找慢

    检测大写字母

    题目描述:
    给定一个单词,你需要判断单词的大写使用是否正确。
    我们定义,在以下情况时,单词的大写用法是正确的:

    • 全部字母都是大写,比如"USA"。
    • 单词中所有字母都不是大写,比如"leetcode"。
    • 如果单词不只含有一个字母,只有首字母大写, 比如 "Google"。

    输入: "USA"
    输出: True
    答案如下:

    class Solution(object):
        def detectCapitalUse(self, word):
            """
            :type word: str
            :rtype: bool
            """
            if (word[0].upper()+word[1:].lower())==word or word==word.upper() or word == word.lower():
                return True
            else:
                return False
    

    三种场景满足其中一种即返回True:

    • 1.全是小写字母
    • 2.全是大写字母
    • 3.首字母大写

    缺失数字

    题目描述:
    给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。

    输入: [9,6,4,2,3,5,7,0,1]
    输出: 8

    解题思路:

    将列表中所有数相加得到一个数n
    将列表中最大的数,求0 1 2 3...到n的和,得到m
    m-n的差即为缺失的数字

    答案:

    class Solution(object):
        def missingNumber(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            num=0
            for i in nums:
                num = i+num
            n=0
            for i in range(max(len(nums)+1,sorted(nums)[-1]+1)):
                n=n+i
            return(n-num)
    

    删除排序数组中的重复项

    题目描述:
    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

    不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

    给定 nums = [0,0,1,1,1,2,2,3,3,4],
    函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

    思路:

    对比num[i] 和 num[i+1]的值,相同则删去一个

    答案:

    class Solution(object):
        def removeDuplicates(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            i=0
            while i < len(nums)-1:
                if nums[i] == nums[i+1]:
                    del(nums[i])
                    continue
                i+=1
            print nums 
    

    重复的子字符串

    题目描述:
    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000

    输入: "abcabcabcabc"
    输出: True

    解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

    思路

    既然是重复字符串,可以理解是sn= s*n
    遍历sn的一半(节约时间),如果找到 sn[:i] * length/i == sn即满足重复字符串

    答案:

    class Solution(object):
        def repeatedSubstringPattern(self, s):
            """
            :type s: str
            :rtype: bool
            """
            length = len(s)
            for i in range(1,length/2+1):
                if length % i == 0:
                    if s==(s[:i] * (length/i)):
                        return True
                        break
            else:
                return False
    

    重复叠加字符串匹配

    题目描述:
    给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1。

    举个例子,A = "abcd",B = "cdabcdab"。
    答案为 3, 因为 A 重复叠加三遍后为 “abcdabcdabcd”,此时 B 是其子串;A 重复叠加两遍后为"abcdabcd",B 并不是其子串

    思路
    • 如果A比B长:
      • A包含B,返回1
      • A不包含B,A*2,如果还不包含B ,那就永远不可能包含了,返回-1
    • 如果A比B短或者一样长
      假设B的A长的n倍,那么 至少A*n才有可能包含B的话

    答案:

    class Solution(object):
        def repeatedStringMatch(self, A, B):
            """
            :type A: str
            :type B: str
            :rtype: int
            """
            lenA=len(A)
            lenB=len(B)
            i=lenB // lenA
            if B not in A:
                for n in range(i,2*(i+2)):
                    if B in A * n:
                        return n
                        break
                else:
                    return -1
            else:
                return 1
    

    更多答案,请参考 Github ,欢迎批评指正,交流学习。

    相关文章

      网友评论

        本文标题:LeetCode刷刷题(二)

        本文链接:https://www.haomeiwen.com/subject/xkftwftx.html