陈沙克

Jan 142021
 

链表,这个我也是第一次碰到,知道他和列表的区别。就借助这个练习来了解。

https://leetcode.com/problems/merge-two-sorted-lists/

代码不复杂

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:


        if l1 is None:
            return l2
        if l2 is None:
            return l1
        if l1.val < l2.val:
            l1.next = self.mergeTwoLists(l1.next, l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1, l2.next)
            return l2

慢慢再理解。

Jan 132021
 

这道题是判断输入的符号是否合法。

https://leetcode.com/problems/valid-parentheses/

这道题涉及到所谓栈,stack,所谓的后进先出。这个需要理解一下。

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        dic={'(':')','[':']','{':'}'}

        for i in s:
            if i in dic:
                stack.append(i)
            elif len (stack)== 0 or dic[stack.pop()]!=i:
                return False

        return len(stack)==0

代码理解

  1. 建立一个字典
  2. 建立一个空的栈,stack
  3. for循环,如果在字典里,例如左括号,那么就会放到stack上。
  4. 当 i 遇到右括号,由于不在字典里,就运行 elif  , 如果这个时候 stack是空的话,说明没有左括号。或者stack刚刚进入的值的字典里,不是左括号,value 不等于 右括号。那么就是False
  5. 最后,必须stack为空,才能确认是合法的,例如只有一个左括号。

把左边的符号,都放到stack里,右边的符号,从stack拿出来,去字典把value取出来,如果等,那么就继续运行下去。一直到stack里为空,才能证明是有效。

Jan 132021
 

题目很简单,寻找开头相同的字母,看看最大是多少。

https://leetcode.com/problems/longest-common-prefix/

每次看到这种题目,都有一种想法,如果python,有一个内置函数搞定这种看上去比较普遍的问题,多好。没想到这个问题,就是这种情况。居然有内置的函数,直接搞定。

Input: strs = [“flower”,”flow”,”flight”]
Output: “fl”

https://medium.com/@d_dchris/10-methods-to-solve-the-longest-common-prefix-problem-using-python-leetcode-14-a87bb3eb0f3a

上面的朋友用了10种方法来解答,我最喜欢的,还是最后一种。

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        return os.path.commonprefix(strs)
Jan 122021
 

把罗马数字转换成阿拉伯数字,这个题目让我好好学习了一下罗马数字

https://leetcode.com/problems/roman-to-integer/

class Solution:
    def romanToInt(self, s: str) -> int:
        d = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,'IV':4,'IX':9,'XL':40,'XC':90,'CD':400,'CM':900}
        result = 0
        i = 0
        while i<len(s):
            if s[i:i+2] in d:
                result=result+d[s[i:i+2]]
                i=i+2
                continue
            elif s[i:i+1] in d:
                result=result+d[s[i:i+1]]
                i=i+1
        return result

代码理解

  1. 创建了一个字典,输入相关的罗马的数字的对应阿拉伯数字
  2. 设置result 变量,作为结果的输出
  3. s = “MCMXCIV” 作为例子来理解代码
  4. 第一轮,对字符串取前两位,MC,如果在字典里,那么就把放到result里,因为MC不在字典,所以为False,不会执行下面的代码,直接跳到elif ,那么这时候,就看第一个字母是否在字典里,如果在,那么就把结果加入到result里,这个时候,result就是1000。并且i 变成1
  5. 第二轮,我们取第二,第三位,CM,看看是否在字典里,刚好在,CM是900,那么就放到result里面,现在result就变成1900,i 变成3. continue 导致继续循环,到下面2位
  6. 第三轮,还是2位,XC,也刚好是在字典,90,
  7. 第四轮,最后2位,也是在字典,4.

写的也是非常巧妙。先拿两位到字典查询,如果没有,再拿一位取查询。

Jan 122021
 

估计没几个人能认识这样的单词。意思倒是不复杂,

https://leetcode.com/problems/palindrome-number/

就是把一个数字,反转过来,数值和原来相对的数字。例如,121,你反转后,还是121

题目专门提到不能使用字符串的方式来解答这个问题,那么就只能老实点。

class Solution:
    def isPalindrome(self, x: int) -> bool:
        num=0
        a=abs(x)

        while a!=0 :
            temp=a%10
            num=num*10+temp
            a=int(a/10)

        if x >= 0 and x == num:
            return True
        else:
            return False

代码理解

  1. 把x取 绝对值
  2. 设置num 变量,他是0
  3. 目标就是a会逐步变成0,而num是逐步变成反转数字
  4. 使用一个临时变量temp,取得当前数字的第一位
  5. 把第一位的数字放到num上,并且把这个数字乘10,左移动一位。
  6. 通过对a的整数,拿掉第一位的数字
  7. 后续就是十位相同的操作。
  8. 一直到a变成0,while 停止
  9. 负数都不能满足这个条件
Jan 122021
 

这是刷的第二题,其实是easy程度的第二题,题目比较简单。

就是把数字反转,要考虑正负,0的处理。

https://leetcode.com/problems/reverse-integer/

就是把数字 321,转换c123,120,转换成 21。需要处理几个特殊的情况,正负和零。

解答1

这个最高效的解决办法,我反而看懂了。

class Solution:
    def reverse(self, x: int) -> int:
        y = abs(x)
        y = str(y)
        y = y.strip()
        y = y [::-1]
        y=int(y)


        if y >= 2**31-1 or y<= -2**31:
            return 0
        elif x < 0:
            return -y
        else:
            return y

说一下我的理解

  1. 设置一个变量,y,把x的绝对值
  2. 变成字符串
  3. 去掉末尾的0
  4. 字符串反转
  5. 变成整数
  6. 做一个边界的判断。
  7. 根据n的正负,确定返回值。