小李飞刀:刷题第四弹!
隨便說點啥
TIME:2019-02-01
昨晚其實刷了題來著,但是沒有解出來,哭泣!
但是,今天重新寫了下,解出來咯~
所以今天的題量要增加咯~
我會加油的!
第一題
14. 最長公共前綴
難度:簡單
如果不存在公共前綴,返回空字符串 ""。
我的解題代碼如下:
class Solution:def longestCommonPrefix(self, strs):""":type strs: List[str]:rtype: str"""length = len(strs)result = ""if length < 1:#如果空就不需要比較return resultif length < 2:result = strs[0]return result#找到最短詞,避免越界l = len(strs[0])for i in strs[1:]:if l > len(i):l = len(i)#最小的循環(huán)次數(shù)for j in range(l):#循環(huán)二維 strs[a][j]for a in range(1,length):if strs[0][j] == strs[a][j]:#始終按第一個數(shù)組來做比對if a == length - 1:#數(shù)組最后一位result = result + strs[0][j]else:return resultreturn result
因為是第二遍寫了,所以加了很多奇怪的注釋,但是思路清晰很多。
注釋還是很重要的~
我的主要思路是:
- 判斷數(shù)據(jù)量是否需要繼續(xù)循環(huán)判斷,數(shù)組長度為0和為1情況下結(jié)果不同。(為1的時候要返回數(shù)組本身....因為這個所以執(zhí)行錯誤一次)
- 當需要循環(huán)判斷的時候,始終拿strs[0][j]就是數(shù)組第一項的每一個字母來做比較。
- 雙重循環(huán)來判斷,一層是判斷數(shù)組每個數(shù),一層是判斷是否有項目超出字母數(shù)量。
總結(jié):
雙重循環(huán)的效率還是比較低的,可以再考慮優(yōu)化下,看下官方題解的方式。
第二題
13. 羅馬數(shù)字轉(zhuǎn)整數(shù)
難度:簡單
字符 數(shù)值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 羅馬數(shù)字 2 寫做 II ,即為兩個并列的 1。12 寫做 XII ,即為 X + II 。 27 寫做 XXVII, 即為 XX + V + II 。
通常情況下,羅馬數(shù)字中小的數(shù)字在大的數(shù)字的右邊。但也存在特例,例如 4 不寫做 IIII,而是 IV。數(shù)字 1 在數(shù)字 5 的左邊,所表示的數(shù)等于大數(shù) 5 減小數(shù) 1 得到的數(shù)值 4 。同樣地,數(shù)字 9 表示為 IX。這個特殊的規(guī)則只適用于以下六種情況:
I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。
給定一個羅馬數(shù)字,將其轉(zhuǎn)換成整數(shù)。輸入確保在 1 到 3999 的范圍內(nèi)。
我的解題代碼如下:
class Solution:def romanToInt(self, s):""":type s: str:rtype: int"""result = 0dic = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,'IV':4,'IX':9,'XL':40,'XC':90,'CD':400,'CM':900}if len(s) < 2:result = dic[s[0]]return resultlength = len(s)l = 0while l < length:point = s[l]if l + 1 == length:l = l + 1elif point == 'I' and (s[l+1] == 'V' or s[l+1] == 'X'):point = point + s[l+1]l = l + 2elif point == 'X' and (s[l+1] == 'L' or s[l+1] == 'C'):point = point + s[l+1]l = l + 2elif point == 'C' and (s[l+1] == 'D' or s[l+1] == 'M'):point = point + s[l+1]l = l + 2else:l = l + 1result = result + dic[point]return result
執(zhí)行效率上屬于偏慢的那一撥。
我的主要思路是:
- 用字典來映射字母對應的數(shù)字,包括需要特殊對待的朋友們
- 當遇到特殊字符的時候做特殊判斷
總結(jié):
- 看了佳揚的思路后茅塞頓開,其實對于特殊字符可以簡單的判斷,他們對應數(shù)字的大小。這樣就簡化判斷為比大小,而不是多重對比字符內(nèi)容。
- 字典用來做映射還是比較快,還是要多研究下它的用法。
第三題
21. 合并兩個有序鏈表
難度:簡單
我的解題代碼如下:
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = Noneclass Solution:def mergeTwoLists(self, l1, l2):""":type l1: ListNode:type l2: ListNode:rtype: ListNode"""r = ListNode(0)#游標result = rwhile 1:if l1 is None and l2 is None:return Noneelif l1 is None:return l2elif l2 is None:return l1elif l1.val < l2.val:r.val = l1.vall1 = l1.nextif l1 is None:r.next = l2breakr.next = ListNode(0)r = r.nextelse:r.val = l2.vall2 = l2.nextif l2 is None:r.next = l1breakr.next = ListNode(0)r = r.nextreturn result
算是比較大眾的一個效率。
我的主要思路是:
- 對比兩個鏈表節(jié)點的值,首先取小的值,才會有序。
- 判斷每次的l1和l2是否有next,當其中一個不存在的時候,就可以直接連接另一條鏈表了。
總結(jié):
- 鏈表的結(jié)構(gòu)第一次接觸。本題主要是熟悉了下對當前節(jié)點部署下一節(jié)點的方法。主要方式為將游標指向下一節(jié)點即可。每次都對節(jié)點進行操作。
- 鏈表的形式還有多種,包括對其的增刪改查,都需要再熟悉。
總結(jié)
以上是生活随笔為你收集整理的小李飞刀:刷题第四弹!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vivo Y81s的usb调试模式在哪里
- 下一篇: 科创板允许红筹企业上市 条件成熟后BAT