classSolution: deftwoSum(self, nums: List[int], target: int) -> List[int]: for i inrange(len(nums)): for j inrange(i+1,len(nums)): #两数不重复 if nums[i]+nums[j]==target: return([i,j])
9. 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 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。
给定一个罗马数字,将其转换成整数。
classSolution: deflongestCommonPrefix(self, strs: List[str]) -> str: Flag=True if strs[0]=='': #第一个元素为空时,输出空 return('') else: strs_1=strs[0] iflen(strs)==1: #只有1个元素时,直接输出该元素 return(strs_1) i=0 while Flag: for j inrange(1,len(strs)): strs_j=strs[j] Flag=Flag and strs_1[0:i]==strs_j[0:i] #判断前缀是否相同 ifnot Flag: break i+=1 if i==len(strs_1)+1: #限制i的大小 break if i==0: return('') else: return(strs_1[0:i-1])
20. 有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution: defisValid(self, s: str) -> bool: d={ ')':'(', ']':'[', '}':'{' } #作字典,建立对应关系 stack=[] for i in s: if i in d: ifnot stack or stack[-1]!=d[i]: #如果栈为空或栈顶的左括号和右括号不符合,输出False returnFalse stack.pop() #栈不为空,且栈顶左括号与右括号匹配,删除这个左括号 else: stack.append(i) returnnot stack #栈为空,说明全部匹配,输出True;否则输出False
21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next classSolution: defmergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: head=ListNode() #哨兵节点 lst=head while list1 and list2: if list1.val <=list2.val: #判断大小,节点连接到较小的节点 lst.next=list1 list1=list1.next#取完节点后,指向下一个节点 else: lst.next=list2 list2=list2.next lst=lst.next#判断下一个节点 lst.next=list2 ifnot list1 else list1 #判断None情况 return head.next
classSolution: defsearchInsert(self, nums: List[int], target: int) -> int: #因为要求时间复杂度为O(log n),故使用二分法 b=len(nums) a=0 #先判断两个端点 if target<=nums[a]: return a elif target>nums[b-1]: return b #再进行二分 i=b//2 while i-a: if target==nums[i]: return i if target<nums[a]: return a elif target>nums[b-1]: return b elif target<nums[i]: b=i i=(a+b)//2 elif target>nums[i]: a=i i=(a+b)//2 return b
classSolution: deflengthOfLastWord(self, s: str) -> int: #倒过来检索 n=len(s) i=n-1 while i: if s[i]!=' ': break i=i-1 j=i-1 while j>=0: if s[j]==' ': break j=j-1 return i-j
1 2 3 4 5 6 7 8 9 10 11
#通过累加ans来确定非空格单词长度 classSolution: deflengthOfLastWord(self, s: str) -> int: ans = 0 for c in s[::-1]: if c == ' ': if ans: break continue ans += 1 return ans
#题解-动态规划 classSolution: defclimbStairs(self, n: int) -> int: a, b = 1, 1 for _ inrange(n - 1): a, b = b, a + b return b
88. 合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
1 2 3 4 5 6 7 8 9
classSolution: defmerge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: """ Do not return anything, modify nums1 in-place instead. """ del nums1[m:] for i inrange(n): nums1.append(nums2[i]) #把nums2中的元素加到nums1中 nums1.sort() #排序
94. 二叉树的中序遍历
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
1 2 3 4 5 6 7 8 9 10 11 12 13
# 递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right
给你一个整数 n ,找出从 1 到 n 各个整数的 Fizz Buzz 表示,并用字符串数组 answer(下标从 1 开始)返回结果,其中:
answer[i] == "FizzBuzz" 如果 i 同时是 3 和 5 的倍数。
answer[i] == "Fizz" 如果 i 是 3 的倍数。
answer[i] == "Buzz" 如果 i 是 5 的倍数。
answer[i] == i (以字符串形式)如果上述条件全不满足。
1 2 3 4 5 6 7 8 9 10 11
classSolution: deffizzBuzz(self, n: int) -> List[str]: #用字符串拼接减少了一次循环判断 res = [] for i inrange(1,n+1): s = '' if i % 3 == 0: s += ('Fizz') if i % 5 == 0: s += ('Buzz') if s == '': s = str(i) res.append(s) return res
给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。
客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。
1 2 3 4 5 6
classSolution: defmaximumWealth(self, accounts: List[List[int]]) -> int: lst = [] for item in accounts: lst.append(sum(item[i] for i inrange(len(item)))) returnmax(lst)