【面试常手撕代码总结】

最近一直在春招,经历了许多次面试,对自己遇到的代码题进行一下总结:

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)
经验分享 程序员 微信小程序 职场和发展