LeetCode学习笔记1
1.判断是否回文数:
def isPalindrome(x): x=str(x) xx=x[::-1] return True if xx==x else False isPalindrome(-121)#False isPalindrome(121)#True
2.给定一个无序的整数数组,找到其中最长上升子序列的长度。(动态规划)
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
class Solution: def lengthOfLIS(self, nums: List[int]) -> int: if nums==[]: return 0 L=len(nums) dp=[1 for _ in range(L)] for i in range(L): for j in range(i): if nums[j]<nums[i]: dp[i]=max(dp[i],dp[j]+1) return max(dp)
3.给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: start,res,cache=0,0,{} for idx,c in enumerate(s): if c in cache and cache[c]>=start: start=cache[c]+1 cache[c]=idx else: cache[c]=idx cur=idx-start+1 res=max(res,cur) return res
4.给定两个大小为 m 和 n 的正序(从小到大)数组 nums1
和 nums2
。请你找出这两个正序数组的中位数,
class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: nums3=nums1+nums2 nums3.sort() i=len(nums3)//2 j=len(nums3)//2-int(len(nums3)%2==0) return (nums3[i]+nums3[j])/2
6.将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
class Solution: def convert(self, s: str, numRows: int) -> str: cache=[i for i in range(numRows)]+[i for i in range(1,numRows-1)][::-1] res=['']*numRows for i ,c in enumerate(s): res[cache[i%len(cache)]]+=c return ''.join(res)
7.给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
class Solution: def reverse(self, x: int) -> int: strx=str(x) x=int('-'+strx[1:][::-1]) if x<0 else int(strx[::-1]) return x if (-2**31)<x<(2**31-1) else 0
8.首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:
如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0 。
提示:
本题中的空白字符只包括空格字符 ' ' 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
class Solution: def myAtoi(self, str: str) -> int: str=str.lstrip() if len(str)==0 or (str[0].isdigit()==False and str[0] not in ['-','+']): return 0 res,i=str[0],1 while i<len(str) and str[i].isdigit(): res+=str[i] i+=1 try: res=int(res) return min(max(res,-2**31),2**31-1) except: return 0
9.判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
class Solution: def isPalindrome(self, x: int) -> bool: return x>=0 and int(str(x)[::-1])==x class Solution: def isPalindrome(self, x: int) -> bool: if x<0 :return False res,temp=0,x while temp:#数字反取 res=res*10+temp%10 temp//=10 return res==x
13. 罗马数字转整数
class Solution: def romanToInt(self, s: str) -> int: ref={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M' : 1000} if not str: return 0 res=ref[s[0]]#第一数字先确定 for i in range(1,len(s)): prev=s[i-1] cur=s[i] if ref[prev]<ref[cur]: res+=(ref[cur]-2*ref[prev])#因为prev已经加过一次了,所以减2倍 else: res+=ref[cur]#加上后面的值 return res
14.查找字符串数组中的最长公共前缀
class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: if not strs: return '' res=min(strs,key=len) for j in strs: for i in range(len(res)): if j[i]!=res[i]: res=res[:i] break return res
15.给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
20.给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
class Solution: def isValid(self, s: str) -> bool: stack=[] cache={'(':')','[':']','{':'}'} for c in s: if c in cache: stack.append(c) continue if len(stack)==0 or cache[stack.pop()] !=c: return False return stack==[]