Go语言面试题记录

题目大意如下:
在10W数中通过比较的方式找出前100大的数,比较次数不超过102000次,额外最多允许申请一个空间。

package main

import (
	"fmt"
	_ "math"
	"math/rand"
)

func solution(arr []int) ([]int, int){
	length := len(arr)
	middleArrLayers := getLayer(length)
	middleArrLength := getLength(middleArrLayers)
	middle := make([]int, middleArrLength)
	count := 0
	for i := 0;i<len(middle);i++{
		middle[i] = -1
	}
	result := make([]int, 0)
	layerStartIndex := getLayerIndex(middleArrLayers)
	layerCurrentIndex := layerStartIndex
	for arrIndex := 0;arrIndex<length;arrIndex++ {
		middle[layerCurrentIndex] = arrIndex
		layerCurrentIndex++
	}
	for currentLayer := middleArrLayers;currentLayer>0;currentLayer--{
		start := getLayerIndex(currentLayer)
		end := getLayerIndex(currentLayer+1)
		for index_:= start; index_ < end; index_+=2 {
			parent := getParent(index_)
			count++
			var maxIndex int
			if middle[index_] == -1 {
				middle[parent] = -1
			} else {
				if middle[index_+1] == -1 {
					middle[parent] = middle[index_]
				} else {
					if index_+1 < end {
						if arr[middle[index_]] >= arr[middle[index_+1]] {
							maxIndex = middle[index_]
						} else {
							maxIndex = middle[index_+1]
						}
					} else {
						maxIndex = middle[index_]
					}

					middle[parent] = maxIndex
				}
			}
		}
	}

	for i:=0;i<100;i++ {
		result = append(result, arr[middle[1]])
		bottomIndex := getBottom(middle, middle[1], middleArrLength)
		middle[bottomIndex] = -1
		current := bottomIndex
		for current > 0 {
			parent := getParent(current)
			left := 2*parent
			right := 2*parent + 1
			if middle[left] == -1 && middle[right] == -1 {
				middle[parent] = -1
				current = parent
			} else if middle[left] == -1 {
					middle[parent] = middle[right]
					current = parent
			} else if middle[right] == -1 {
				middle[parent] = middle[left]
				current = parent
			} else {
				if arr[middle[left]] >= arr[middle[right]] {
					middle[parent] = middle[left]
					count++
				} else {
					middle[parent] = middle[right]
					count++
				}
				current = parent
			}
		}
	}
	return result, count
}


func getLayer(n int) int {
	i := 0
	currentLayer := 1
	for currentLayer < n {
		currentLayer *= 2
		i++
	}
	return i
}


func getLength(n int) int {
	length := 1
	for i:=0;i<=n;i++ {
		length *= 2
	}
	return length+1
}


func getLayerIndex(n int) int {
	startIndex := 1
	for i:= 0;i<n;i++ {
		startIndex *= 2
	}
	return startIndex
}

func getParent(index int) int {
	return index / 2
}

func getBottom(middleArr []int, index int, length int) int {
	current := 1
	for current*2 < length {
		if middleArr[current*2] == index {
			current = current*2
		} else if current*2+1 < length && middleArr[current * 2+1] == index{
			current = current*2 + 1
		} else {
			break
		}
	}
	return current
}


func getRandomData() []int {
	data := make([]int, 0)
	for i:=0;i<100001;i++{
		data = append(data, rand.Int()%100000)
	}
	return data
}

func main() {
	data:= getRandomData()
	result, count := solution(data)
	fmt.Println(result)
	fmt.Println(count)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值