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
待解

原创粉丝点击