【面试常手撕代码总结】
最近一直在春招,经历了许多次面试,对自己遇到的代码题进行一下总结:
1.topk问题 这题应该算高频考题了,上次字节二面手撕这个(不准调用任何库函数),当时一开始用的冒泡解决的,复杂度较高,后面想用堆排优化,堆排细节太多。正确的应该用这个快排来解决,复杂度能降到NlogK。
# encoding=gbk def partition(nums, left, right): pivot = nums[left] i,j = left, right while(i < j): while(i<j and nums[j]>=pivot): j-=1 nums[i] = nums[j] #小数左移 while(i<j and nums[i]<=pivot): i+=1 nums[j] = nums[i] #大数右移 nums[i] = pivot #对比值回归 return i #优化记忆版本 # def partition(arr, low, high): # i = (low - 1) # pivot = arr[low] # # for j in range(low, high): # if arr[j] <= pivot: # i = i + 1 # arr[i], arr[j] = arr[j], arr[i] # # arr[i + 1], arr[high] = arr[high], arr[i + 1] # return (i + 1) def topk_split(nums, k, left, right): if (left<right): index = partition(nums, left, right) if index==k: return elif index < k: topk_split(nums, k, index+1, right) else: topk_split(nums, k, left, index-1) def topk_larges(nums, k): topk_split(nums, len(nums)-k, 0, len(nums)-1) #把k换成len(nums)-k return nums[len(nums)-k:] arr = [1,1,2,2,3,-2,3,0,-19] k = 3 print(topk_larges(arr, k)) print(arr)
上一篇:
通过多线程提高代码的执行效率例子