python leetcode 1
開始刷 leetcode, 簡(jiǎn)單筆記下自己的答案, 目標(biāo)十一結(jié)束之前搞定所有題目.
提高一個(gè)要求, 所有的答案執(zhí)行效率必須要超過 90% 的 python 答題者.
1. Two Sum.
class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""tmp = []for i, j in enumerate(nums):tmp.append((i, j))for k, item in enumerate(tmp):l, m = itemfor o, p in tmp[k+1:]:if m + p == target:return sorted((l, o))runtime beats: 21.30%
優(yōu)化1
class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""for i, j in enumerate(nums):for k, l in enumerate(nums[i+1:]):if j + l == target:return (i, k + i + 1)runtime beats: 21.97%
還是不行, 肯定還有別的辦法.
?
2.?Add Two Numbers
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = Noneclass Solution(object):def addTwoNumbers(self, l1, l2):""":type l1: ListNode:type l2: ListNode:rtype: ListNode"""def gen(listnode):yield listnode.valwhile listnode.next:listnode = listnode.nextyield listnode.valdef izip_longest(gen1, gen2):flag1, flag2 = True, Truetry:i = gen1.next()except:i = 0flag1 = Falsetry:j = gen2.next()except:j = 0flag2 = Falseyield i, jwhile flag1 or flag2:try:i = gen1.next()except:i = 0flag1 = Falsetry:j = gen2.next()except:j = 0flag2 = Falseif flag1 or flag2:yield i, jresult = []tmp = 0for i, j in izip_longest(gen(l1), gen(l2)):sum = i + j + tmpif sum < 10:tmp = 0result.append(sum)else:tmp = 1result.append(sum - 10)if tmp:result.append(tmp)return resultruntime beats: 95.07%
用 python 刷題是有點(diǎn)不要臉了, 本題的關(guān)鍵是 itertools.izip_longest, 但是平臺(tái)說不認(rèn)識(shí), 于是就自己攢了一個(gè)極端丑陋的版本. 有時(shí)間回頭再優(yōu)化.
?
3. Longest Substring Without Repeating Characters
class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""if not s:return 0tmp = set(s)length_tmp = len(tmp)length = len(s)while length_tmp > 0:for i in xrange(length - length_tmp + 1):t = s[i:length_tmp + i]if len(set(t)) < len(t):continueif set(t) <= tmp:return length_tmplength_tmp -= 1?
4.?Median of Two Sorted Arrays
class Solution(object):def findMedianSortedArrays(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: float"""tmp = sorted(nums1 + nums2)length = len(tmp)half = length / 2.0if int(round(half)) == int(half):return (tmp[int(half) - 1] + tmp[int(half)]) / 2.0else:return tmp[int(half)]...需要看看 sorted 的源碼, 這樣刷題有什么意思, 完全是在作弊.
?
5.?Longest Palindromic Substring
class Solution(object):def longestPalindrome(self, s):""":type s: str:rtype: str"""if not s:return Nonedef reverse1(string):return string[::-1]def reverse2(string):tmp = list(string)tmp.reverse()return "".join(tmp)length = len(s)for i in xrange(length, 0, -1):for j in xrange(length - i + 1):tmp = s[j:i+j]if tmp == reverse1(tmp):return tmpTime Limit Exceeded
python 判定回文很簡(jiǎn)單 string == string[::-1], 但是時(shí)間超時(shí)了, 暫時(shí)想不到更好的方法, 繼續(xù)下一題.
?
6.?ZigZag Conversion
class Solution(object):def convert(self, s, numRows):""":type s: str:type numRows: int:rtype: str"""tmp = []if numRows == 1:return sif len(s) <= numRows:return sdef attempt(gen):tag = Truetry:rslt = gen.next()except:rslt = ""tag = Falsereturn tag, rsltdef izip_longest(gen1, gen2):gen1 = iter(gen1)gen2 = iter(gen2)tag1, rslt1 = attempt(gen1)tag2, rslt2 = attempt(gen2)yield rslt1, rslt2while tag1 or tag2:tag1, rslt1 = attempt(gen1)tag2, rslt2 = attempt(gen2)if rslt1 or rslt2:yield rslt1, rslt2step = (numRows - 1) * 2for i in xrange(numRows):if(i == 0 or i == numRows - 1):tmp.extend(s[i::step])else:j = (numRows - 1 - i) * 2for _ in izip_longest(s[i::step], s[i+j::step]):tmp.extend(_)return "".join(tmp)?
7.?Reverse Integer
class Solution(object):def reverse(self, x):""":type x: int:rtype: int"""# what's the hell?if x > 2**31 - 1:return 0if x < -2**31:return 0if x >= 0:tmp = list(str(x))tmp.reverse()rslt = int("".join(tmp))return rslt if -2**31 <= rslt <= 2**31 -1 else 0else:tmp = list(str(0 - x))tmp.reverse()rslt = 0 - int("".join(tmp))return rslt if -2**31 <= rslt <= 2**31 -1 else 0?
8.?String to Integer (atoi)
class Solution(object):def myAtoi(self, str):""":type str: str:rtype: int"""def search(lst, s):i = 0for j in lst:if j == s:i += 1return idef parse(s):if not s:return 0if s == "+" or s == "-":return 0if search(s, "+") + search(s, "-") > 1:return 0else:rslt = int(s)if rslt > 2**31 -1:return 2**31 -1if rslt < -2**31:return -2**31return rsltstr = str.strip()if not str:return 0tmp = []for i in str:if i in ("+", "-") or i.isdigit():tmp.append(i)else:breakstring = "".join(tmp)return parse(string)?
9.?Palindrome Number
class Solution(object):def isPalindrome(self, x):""":type x: int:rtype: bool"""if x < 0 or x > 2**31 - 1:return Falsetmp = list(str(x))if tmp == tmp[::-1]:if int("".join(tmp[::-1])) > 2**31 -1 :return Falseelse:return Trueelse:return False?
12.?Integer to Roman
class Solution(object):def intToRoman(self, num):""":type num: int:rtype: str"""def convert(value, ten, five, one):rslt = []if not value:return ""if value == 9:rslt.append(one + ten)elif value >= 5:rslt.append(five + one * (value - 5))elif value == 4:rslt.append(one + five)else:rslt.append(one * value)return "".join(rslt)thousand = num // 1000handred = (num - thousand * 1000) // 100decade = (num - thousand * 1000 - handred * 100) // 10unit = (num - thousand * 1000 - handred * 100 - decade * 10)result = []if thousand:result.append("M" * thousand)result.append(convert(handred, 'M', 'D', 'C'))result.append(convert(decade, 'C', 'L', 'X')) result.append(convert(unit, 'X', 'V', 'I'))return "".join(result)?
13.?Roman to Integer
class Solution(object):def romanToInt(self, s):""":type s: str:rtype: int"""result = 0tmp = list(s)def get(lst, num):try:return lst[num]except:return Nonedef calculate(tmp, i, j):if j == "M":return 1000if j == "D":return 500if j == "L":return 50if j == "V":return 5if j == "C" and get(tmp, i+1) not in ("M", "D"):return 100elif j == "C" and get(tmp, i+1) in ("M", "D"):return -100if j == "X" and get(tmp, i+1) not in ("C", "L"):return 10elif j == "X" and get(tmp, i+1) in ("C", "L"):return -10if j == "I" and get(tmp, i+1) not in ("X", "V"):return 1elif j == "I" and get(tmp, i+1) in ("X", "V"):return -1for i, j in enumerate(tmp):result += calculate(tmp, i, j)return result?
14.?Longest Common Prefix
class Solution(object):def longestCommonPrefix(self, strs):""":type strs: List[str]:rtype: str"""# os.path.commonprefixif not strs:return ""shortest = strs[0]for i in strs:if len(shortest) > len(i):shortest = ifor i in xrange(len(shortest), 0, -1):tag = Truetmp = shortest[:i]for j in strs:if j[:i] != tmp:tag = Falseif tag:return tmpreturn ""?
15.?3Sum
class Solution(object):def threeSum(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""if not nums:return []length = len(nums)rslt = []for i in xrange(0, length):v_i = nums[i]for j in xrange(i+1, length):v_j = nums[j]for k in xrange(j+1, length):v_k = nums[k]if v_i + v_j + v_k == 0:rslt.append(tuple(sorted([v_i, v_j, v_k])))return list(set(rslt))Time Limit Exceeded
?
16.?3Sum Closest
class Solution(object):def threeSumClosest(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""if not nums:return []length = len(nums)mapping = {}rslt = set()for i in xrange(0, length):v_i = nums[i]for j in xrange(i+1, length):v_j = nums[j]for k in xrange(j+1, length):v_k = nums[k]_abs = abs(v_i + v_j + v_k - target)mapping[_abs] = v_i + v_j + v_krslt.add(_abs)return mapping[min(rslt)]Time Limit Exceeded
?
17.?Letter Combinations of a Phone Number
class Solution(object):def letterCombinations(self, digits):""":type digits: str:rtype: List[str]"""def multi(lst1, lst2):if not lst1:return lst2rslt = []for i in lst1:for j in lst2:rslt.append(i + j)return rsltdef worker(lst):rslt = []for i in lst:rslt = multi(rslt, i)return rsltmapping = {2: "abc",3: "def",4: "ghi",5: "jkl",6: "mno",7: "pqrs",8: "tuv",9: "wxyz"}if not digits:return []if len(digits) == 1:return list(mapping[int(digits)])lst = [mapping[int(_)] for _ in digits if 1 < int(_) <= 9]return worker(lst)?
18.?4Sum
class Solution(object):def fourSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[List[int]]"""if not nums:return []length = len(nums)rslt = []for i in xrange(0, length):v_i = nums[i]for j in xrange(i+1, length):v_j = nums[j]for k in xrange(j+1, length):v_k = nums[k]for l in xrange(k+1, length):v_l = nums[l]if v_i + v_j + v_k + v_l == target:rslt.append(tuple(sorted([v_i, v_j, v_k, v_l])))return list(set(rslt))Time Limit Exceeded
?
19. Remove Nth Node From End of List
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = Noneclass Solution(object):def removeNthFromEnd(self, head, n):""":type head: ListNode:type n: int:rtype: ListNode"""def gen(node):yield node.valwhile node.next:node = node.nextyield node.vallst = [_ for _ in gen(head)]del lst[-n]return lst?
20.?Valid Parentheses
class Solution(object):def isValid(self, s):""":type s: str:rtype: bool"""left = ["(", "{", "["]right = [")", "}", "]"]tmp = []for i in s:if i in left:tmp.append(i)if i in right:index = right.index(i)try:j = tmp.pop()except:return Falseelse:if j != left[index]:return Falseif not tmp:return Trueelse:return False?
21.?Merge Two Sorted Lists
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = x # self.next = Noneclass Solution(object):def mergeTwoLists(self, l1, l2):""":type l1: ListNode:type l2: ListNode:rtype: ListNode"""if not l1 and not l2:return []if not l1 and l2:return l2if l1 and not l2:return l1def gen(node):yield node.valwhile node.next:node = node.nextyield node.valreturn sorted(list(gen(l1)) + list(gen(l2)))?
感受到了一些題目的模式, 需要惡補(bǔ)一下數(shù)據(jù)結(jié)構(gòu)和算法的基礎(chǔ)知識(shí)和套路.
轉(zhuǎn)載于:https://www.cnblogs.com/senjougahara/p/5850431.html
總結(jié)
以上是生活随笔為你收集整理的python leetcode 1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vs 2015 调试ASP.NET Co
- 下一篇: 开发利器_Pigar.快速为Python