发现自己在笔试的时候,面对一些前缀和、模拟的题,宛如成为了废物呜呜呜!
前缀和:
前缀用于求某个区间的元素,差分分用于修改某个区间元素
presum[i]就是 = nums[i] + presum[i - 1]
但是目前没有看出来有什么用,暂时就,先做题感受吧!!最终的目的是把美团那道流星get到555
一维的presum:
看了一下题目果然就是传统意义上的前缀和哈哈哈!然后突然发现一旦离开教程性质的东西,我的能力和效率果然都下降了,所以还是需要培养这种检索的能力呀!!!
然后发现没有代码随想录那种妈喂饭式的帮助,重新习惯并看懂别人讲的代码还是需要时间适应和消化的,但是还是不能放弃坚强和勇敢呀~
差分:
想对nums[i: j + 1]全部都加上3
可以先做nums的差分,然后diff[i] += 3, diff[j + 1] -= 3
华为的准备,夜深人静的时候开始难过了,不知道这样什么时候是个头了呜呜呜,该不会找不到工作吧,不知道到底要准备到什么程度才可以,生活真的好难啊
这道题一看就看不懂,然后发现说其实跟之前第一次面试的题目真的很像,思路什么的,所以基本做codetop应该是真的hin有效果的呜呜呜
其他公司机会不多,所以暂时只有练到华为的机会呜呜呜!
好的这道题我再想想,先做下一道吧
好像e
关于美团的一些codetop,感觉美团的题好像确实就是比华为好想很多的样子
这道题之前面试遇到过,然后方法比较朴素,然后果然就写错了,目前市面上可能会遇到三种情况:
一个比较简单的方式是拷贝,然后这部分我其实做错了很多,错误写法:
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
import copy
num_list = copy.deepcopy(nums1)
cur_1, cur_2 = 0, 0
for i in range(len(nums1)):
if num_list[cur_1] <= nums2[cur_2]:
nums1[i] = num_list[cur_1]
cur_1 += 1
else:
nums1[i] = nums2[cur_2]
cur_2 += 1
直接显示在for里面越界了,因为cur_1, cur_2有可能会加到很复杂的情况,然后包括这里的深拷贝也造成了一定程度上的浪费,所以还是正常使用复制会比较节约空间:
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
num_list = nums1[:m]
cur_1, cur_2, i = 0, 0, 0
while cur_1 < m and cur_2 < n:
if num_list[cur_1] <= nums2[cur_2]:
nums1[i] = num_list[cur_1]
cur_1 += 1
else:
nums1[i] = nums2[cur_2]
cur_2 += 1
i += 1
# 到了这步还没完,后面还有一点没有遍历到的
if cur_1 == m:
nums1[i:] = nums2[cur_2:]
else:
nums1[i:] = num_list[cur_1:]
还有一个是内部排序(这个明天看了快排再说吧)
还有一个是三指针
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
cur_1, cur_2 = m - 1, n - 1
i = len(nums1) - 1
# while cur_1 > 0 and cur_2 > 0:
while cur_1 >= 0 and cur_2 >= 0:
if nums1[cur_1] >= nums2[cur_2]:
nums1[i] = nums1[cur_1]
cur_1 -= 1
else:
nums1[cur_1] < nums2[cur_2]
nums1[i] = nums2[cur_2]
cur_2 -= 1
# 忘记了i了
i -= 1
# if cur_1 == 0:
if cur_1 == -1:
# nums1[:cur_2] = nums2[:cur_2]
nums1[:cur_2 + 1] = nums2[:cur_2 + 1] # 因为这样才能到当前位
# else: # 无意义
# nums1[:cur_1] = nums1[:cur_1]