35题 搜索插入位置
这个题其实python3 用3行就可以解决了,但是用index这种实在是面试官会直接给你挂掉的程度吧。。这样做题没有收获。看到要求是算法时间复杂度必须在logn。特意去学习了一下,也看了《算法图解》的二分法。搞明白之后写下来不知道怎么解决插入新元素的问题,在题解里看到了return left直接解决,写了几个例子才逐渐理解。
二分法的细节问题有一篇文章写得很好:二分查找详解 - labuladong - 博客园
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums) - 1
while left <= right:
mid = (left + right) // 2
obj = nums[mid]
if obj == target:
return mid
if obj > target:
right = mid - 1
else:
left = mid + 1
return left
第3题 回文数
这个我用了很笨的办法,还变成了列表,就很。。冗杂
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
else:
list_old = list(str(x))
list_new = [str(x % 10)]
for i in range(1, len(list_old)):
list_new.append(str((x // (10 ** i)) % 10))
if list_new == list_old:
return True
else:
return False
但是在题解里学到了一个东西,可以直接倒放字符串:
class Solution:
def isPalindrome(self, x: int) -> bool:
return True if str(x) == str(x)[::-1] else False
第6题 有效的括号
本来想再想想的,不小心看了评论,直接满脑子只有这一个思路了。。。太妙了这个,而且我发现我遇到列表字符串会用的函数就那几个。啊啊啊啊
class Solution:
def isValid(self, s: str) -> bool:
while '()' in s or "{}" in s or '[]' in s:
s = s.replace('()', '')
s = s.replace('[]', '')
s = s.replace('{}', '')
return s == ''
第7题 合并两个有序链表
才知道有链表这个概念... 和IDLE里用完全不一样,整个懵了。看了评论才知道各个函数怎么用,原来l1.val 只是一个值,l1 = l1.next 是链表里的下一个值。拿next作下一个值,小的放给新listnode,l1和l2选小的往后放。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
p = ListNode()
ans = p
while l1 and l2:
if l1.val < l2.val:
p.next = ListNode(l1.val)
l1 = l1.next
else:
p.next = ListNode(l2.val)
l2 = l2.next
p = p.next
if l1:
p.next = l1
else:
p.next = l2
return ans.next