力扣题解-简单难度

不定时更新

1,两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

你可以按任意顺序返回答案。

我的解答:

时间复杂度为O(n^2)

def twoSum(self, nums: List[int], target: int) -> List[int]:
        
        dic = {i:v for i,v in enumerate(nums)}
        
        for i in dic:
            res = target-dic[i]
            for k in dic:
                if res == dic[k] and k!=i:
                    return i,k
 #解题中遇到的问题:
	1. list.index()如果列表中有相同元素,也只返回的第一个元素的索引
  2. enumerate()返回一个生成器,如果用两层循环去循环同一个生成器,那么内层循环不会从第一个元素开始
  3. 不能用列表的值做字典的key,除非你知道如何处理相同key值得覆盖问题

优质解答:

def twoSum(self, nums, target):

        hashmap = {}
        for index, num in enumerate(nums):
            another_num = target - num
            if another_num in hashmap:
                return [hashmap[another_num], index]
            hashmap[num] = index
        return None
特点:
  我的思路是用第一个数找第二个数,本答案思路是由第二个数找第一个数,一个集合中的元素内部有关系时都可以用此方法降低求解难度.

2,整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转

我的解答:

def reverse(self, x: int) -> int:
        
        _x = list(str(abs(x)))
        _x.reverse()   #这里没有必要用列表的reverse,还要拼接回来的,字符串和列表都可以用[::-1]反转
        num = int("".join(_x))
        tag = 2**31
        if x>0 and num <=tag-1:
            return num
        elif x <0 and num <=tag:
            return -num
        else:
            return 0

优质解答:

def reverse(self, x: int) -> int:
        a = str(x) if x>0 else str(-x)+'-'
        a = int(a[::-1])
        return a if a <= 2**31-1 and a >= -2**31-1 else 0

3,回文数

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

我的解答:

def isPalindrome(self, x: int) -> bool:
        if x>=0:
            _x = str(x)
            _x = int(_x[::-1])
            if x == _x:
                return True
        return False

优质解答:

def isPalindrome(self, x: int) -> bool:
        return True if str(x) == str(x)[::-1] else False
  
  #解析:字符串也能比是否相等,先转成字符串反转再转int比较多此一举

4,罗马数组转数字

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

我的解答:一遍过

def romanToInt(self, s: str) -> int:
        dic = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
        res = 0
        i = 0
        while i <len(s)-1:
        
            item = s[i]
            next_item = s[i+1]
            if dic[item]<dic[next_item]:
                res-=dic[item]
            else:
                res += dic[item]
            i+=1
        res += dic[s[i]]
        return res
      #思路:左边小与右边减,左边大于右边加上

5,最大公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

我的答案:

def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs or '' in strs :
            return ''
        if len(strs) == 1:
            return strs[0]

        res = []
        for i in range(len(strs[0])):
            s = strs[0][0:i+1]
            for item in strs:
                if not item.startswith(s):
                    break
            else: #代码走到这说明上面的循环是正常结束的
                res.append(s)
                continue #这个continue是用来控制外层循环的,跳过下面的代码break直接进入下次循环
            break #如果内层循环是正常结束的这个break永远都不会执行
        if res:
            return res[-1]
        return ''
      #暴力求解双循环的控制,内层循环结束整个循环结束rhe控制

优质答案:

def longestCommonPrefix(strs) :
    res = ""
    r = zip(*strs)
    print(r)
    for tmp in zip(*strs):
        tmp_set = set(tmp)
        if len(tmp_set) == 1:
            res += tmp[0]
        else:
            break
    return res

  #1.zip函数的特点,zip可以打包多个对象,循环zip对象得到元组

6,有效的括号

我的解答:超过了98.8%的python

def isValid(self, s: str) -> bool:
        dic = {'(':')','{':'}','[':']'}
        lifo = []
        for i in range(len(s)):
            if not lifo:
                lifo.append(s[i])
            else:
                try:
                    if not dic[lifo[-1]] == s[i]:
                        lifo.append(s[i])
                    else:
                        lifo.pop()
                except:
                    return False

        return False if lifo else True

能配对的话一定是一左配一右,按这个规律存入字典里
循环字符串,不匹配就加到列表里,能匹配就删除列表的最后一个元素
循环结束后列表内没有元素就返回true
如果出现右括号在前,字典内没有这个key,就直接报错

posted @ 2021-01-19 13:34  Franciszw  阅读(229)  评论(0编辑  收藏  举报