LeetCode笔记(1-10)?4,5,10
来源:互联网 发布:透视镜软件下载 编辑:程序博客网 时间:2024/06/08 13:23
刷题笔记,有自己写的也有参考了别人的,非完全原创。
1.Two Sum
#Given an array of integers, return indices of the two#numbers such that they add up to a specific target.#You may assume that each input would have exactly one#solution, and you may not use the same element twice.#第一版class Solution1(object): def twoSum(self,nums,target): for i in range(len(nums)): for j in range(len(nums)): if nums[i]+nums[j]==target and i!=j: result=[i,j] break else:#for循环自带else continue break return result**#第二版**将nums内的数值和对应索引以数值:索引的形象存储在index中,并查找target与当前数值的差值所在的位置class Solution(): def twoSum(self,nums,target): index={}#存储数组的数值:索引 for i in range(len(nums)): if target-nums[i] in index: return [index[target-nums[i]],i] index[nums[i]]=i if __name__=='__main__': solu=Solution() print(solu.twoSum([2,-4,3],-2))
2.Add Two Numbers
#You are given two non-empty linked lists representing two non-negative integers.#The digits are stored in reverse order and each of their nodes contain a single#digit. Add the two numbers and return it as a linked list.#You may assume the two numbers do not contain any leading zero, except the#number 0 itself.#第一版# Definition for singly-linked list.# class ListNode(object):# def __init__(self, x):# self.val = x# self.next = None class Solution(object): def addTwoNumbers(self,l1,l2): ret=ListNode(0)#ListNode为LeetCode中定义好的类 cur=ret#ret保存结果链表的初始位置 carry=0#进位 while l1 or l2 or carry:#判定当前节点或进位任意一个非空 _sum=0#存储当前节点值和进位的总和 if l1: _sum+=l1.val l1=l1.next#更新当前节点 if l2: _sum+=l2.val l2=l2.next _sum+=carry cur.val=(_sum%10) carry=_sum//10#更新当前进位 if l1 or l2 or carry:#当前节点和进位都为空时,计算结束,不再创建新节点 cur.next=ListNode(0)#创建结果链表的下一节点 cur=cur.next return ret#第二版#在求和过程中用carry取代了_sumclass Solution(object): def addTwoNumbers(self,l1,l2): ret=ListNode(0) cur=ret carry=0 while l1 or l2 or carry: if l1: carry+=l1.val l1=l1.next if l2: carry+=l2.val l2=l2.next cur.val=(carry%10) carry=carry//10 if l1 or l2 or carry: cur.next=ListNode(0) cur=cur.next return ret
3.Longest Substring Without Repeating Characters
#Given a string, find the length of the longest substring without repeating characters.#第一版class Solution1(object): def lengthOfLongestSubstring(self, s): lonstr='' curstr='' for char,i in zip(s,range(len(s))): if char in curstr: if len(curstr)>len(lonstr): lonstr=curstr curstr=s[s.rindex(char,0,i)+1:i+1]#rindex找到最近重复的一个字母下标 else: curstr+=char return max(len(curstr),len(lonstr))#最后的curstr可能是最长的字符串,即‘abbcdef’或‘cf'这类的情况#第二版class Solution(object): def lengthOfLongestSubstring(self, s): ret=0#存储max(当前字符串长度,上一个最大合法字符串长度) left=0#记录当前合法字符串的初始位置 last={}#记录上一次出现当前字符出现的位置 for i in range(len(s)): if s[i] in last and last[s[i]]>=left: #last[s[i]]>=left保证当前字符串是合法的,如’abba'类的情况 left=last[s[i]]+1#替换合法字符串初始位置为当前字符上一次出现位置的后一位 last[s[i]]=i#更新当前字符最近一次出现的位置 ret=max(ret,i-left+1) return ret if __name__=='__main__': test=Solution() print(test.lengthOfLongestSubstring('pwwkew'))
4.Median of Two Sorted Arrays
待解
5.Longest Palindromic Substring
待优化
#Given a string s, find the longest palindromic substring in s.#You may assume that the maximum length of s is 1000.#第一版class Solution(object): def longestPalindrome(self,s): lenth=1#最大长度 ret=s[0]#回文字符串 i=0#中心字符串起始位置 while i<len(s): #从s[i]向后找到所有与s[i]连接并相同的项作为中心字符串,即s[i]到s[j-1]的所有字符,即s[i:j]。 j=i+1 while j<len(s) and s[i]==s[j]: j+=1 #从中心字符串两边开始向外查找 k=1 while i-k>=0 and j-1+k<len(s): if s[i-k]!=s[j-1+k]: break k+=1 if j-i+2*k-2>lenth: ret=s[i-k+1:j+k-1] lenth=j-i+2*k-2 i=j#新的中心字符串起始位置 return ret if __name__=='__main__': test=Solution() print(test.longestPalindrome('rggr'))
6.ZigZag Conversion
#ZigZag Conversion#第一版#只输出了字符串,并没有真实的转换为z字形class Solution1(object): def convert(self, s, numRows): if numRows==1 or len(s)<=numRows: return s ret=s[0::2*numRows-2]#第一行 i=2#中间行分两种情况,垂直边上的数据点和斜边上的数据点,两者各自的取值步长均为2*numRows-2 while i<numRows: str1=s[i-1::2*numRows-2]#垂直边 str2=s[2*numRows-1-i::2*numRows-2]#斜边 for j in range(len(str2)):#将垂直边和斜边交叉连接得到第i行字符串 ret+=str1[j] ret+=str2[j] if len(str1)>len(str2):#str1的长度只可能比str2大1或相等, ret+=str1[-1] i+=1 ret+=s[numRows-1::2*numRows-2]#最后一行 return ret#第二版class Solution(object): def convert(self,s,numRows): if numRows==1 or numRows>=len(s): return s newstr={}#以行号为键值,存储每行读取到的字符 for row in range(1,numRows+1):#row行号 newstr[row]='' row=1 flag=1 for i in range(len(s)): if flag==1:#从上向下读 newstr[row]+=s[i] row+=1 if flag==-1:#从下向上读 newstr[row]+=s[i] row+=-1 if row>numRows:#到底行时更新flag和row flag=-1 row=numRows-1 if row<1:#到顶行时更新flag和row flag=1 row=2 ret='' for row in range(1,numRows+1):#顺序读取每一行 ret+=newstr[row] return retif __name__=='__main__': test=Solution() print(test.convert('',1))
7.Reverse Integer
#Reverse digits of an integer.#第一版class Solution1(object): def reverse(self, x): numstr=str(x) if numstr[0]=='-': ret='-' numstr=numstr[1:] else: ret='' for i in range(-1,-len(numstr)-1,-1): ret+=numstr[i] ret=int(ret) if ret>2**31-1 or ret<-2**31: return 0 return ret#第二版class Solution(object): def reverse(self, x): if x==0: return 0 ret=0 sign=x/abs(x)#需先排除x=0的情况 x=abs(x) while x!=0: if ret>0x7fffffff//10:%判断ret*10后是否会溢出 return 0 ret=ret*10+x%10 x//=10 ret=int(sign*ret) return ret#32位带符号整数的范围为-2147483648~2147483647之间,当ret>214748364时(即0x7fffffff//10或2147483647//10),#ret*10必然会溢出。若ret==214748364,考虑到x的范围也在-2147483648~2147483647之间,#x的首位只可能是1或2,#即ret末尾只可能是1或2,均不溢出,因此不用考虑ret==214748364的情况。事实上,#当ret为2147483642时,x对应为2463847412,已经溢出,因此当判断出ret==214748364时,#下一步ret*10+x%10的结果只可能是2147483641,不溢出.if __name__=='__main__': test=Solution() print(test.reverse(1534236469))
8.String to Integer (atoi)
#Implement atoi to convert a string to an integer.#第一版class Solution(object): def myAtoi(self, str): if str=='': return 0 sign=1#存储正负号 num=0#存储数字 flag=0#记录是否读取到有效字符 for i in range(len(str)): if str[i]==' ' and flag==0:#去掉空格 continue for j in range(10): if str[i]=='{0}'.format(j):#str[i]==f'{j}' num=num*10+j flag=1 break else: if str[i]=='-' and flag==0:#判断符号,防止读入两个符号的情况,如+-24 sign=-1 flag=1 elif str[i]=='+' and flag==0: flag=1 else: break num=num*sign if num>=2147483647: return 2147483647 elif num<=-2147483648: return -2147483648 else: return num if __name__=='__main__': test=Solution() print(test.myAtoi(' -11919730356x'))
9.Palindrome Number
#Determine whether an integer is a palindrome. Do this without extra space.#要求空间复杂度O(1),即所需空间为常量,与x大小无关#第一版class Solution(object): def isPalindrome(self, x): if x<0: return False digit=1#存储最高位的权值,如600对应的digit为100 while digit<=x//10: digit*=10 while x>0: if x%10!=x//digit: return False x=(x-x//digit*digit)//10 digit=digit//100 return True#若x=0,两个while不会被执行,直接返回True if __name__=='__main__': test=Solution() print(test.isPalindrome(1001))
10.Regular Expression Matching
待解
阅读全文
0 0
- LeetCode笔记(1-10)?4,5,10
- Leetcode解题笔记(5)
- Leetcode解题笔记(4)
- LeetCode解题笔记(1)
- [leetCode刷题笔记]2017.04.10
- LeetCode小白菜笔记[10]:Implement strStr()
- Leetcode 刷题笔记(1)
- leetcode学习笔记5
- leetcode笔记:4Sum
- leetcode学习笔记4
- leetcode学习笔记1
- leetcode算法笔记1
- LeetCode笔记(二)
- 【LeetCode】Anagrams(笔记)
- LeetCode笔记(21-?)
- 【leetcode】leetcode 刷题 笔记 (不定期更新)
- LeetCode笔记1--Two Sum
- Leetcode解题笔记(string)
- c++多线程重点难点(五)Event
- 小程序字体 text 多种属性样式
- python 机器学习中各种距离
- 802.11 Backoff Timer,bugFix_timer_
- table的表头固定--上下滚动表头固定,左右滚动跟随滚动
- LeetCode笔记(1-10)?4,5,10
- Activity的生命周期和启动模式
- 最小生成树之普里姆算法
- Linux系统上安装VMware Workstation
- 苹果内存取证工具volafox
- c语言编程中%g是什么格式
- 笔记:关于protobuf协议传输repeated(即表/数组)类型数据出错问题。
- JAVA正则表达式 Pattern和Matcher
- try中return某值,而finally中修改了这个值