最近一直在春招,经历了许多次面试,对自己遇到的代码题进行一下总结:
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)