面经之数据结构

1.获取第k大的数

快排:

func partition(a []int, left, right int) int {
	pivot := a[left]
	j := left
	for i := left+1;i <= right;i++ {
		if a[i] < pivot {
			j++
			a[j],a[i] = a[i],a[j]
		}
	}
	a[left],a[j] = a[j],a[left]
	return j
}

func randomPartition(a []int, left,right int) int {
	random := rand.Intn(right-left+1)
	i := left+random
	a[i],a[left] = a[left],a[i]
	return partition(a,left,right)
}

func quickSelect(a []int,left,right,k int) int {
	mid := randomPartition(a,left,right)
	if mid == left+k-1 {
		return a[mid]
	} else if mid > left+k-1 {
		return quickSelect(a,left,mid-1,k)
	} else {
		return quickSelect(a,mid+1,right,k-(mid-left+1))
	}
}


func GetKthNum(a []int, k int) int {
	if k <= 0 || k > len(a) {
		return math.MaxInt64
	}
	return quickSelect(a,0,len(a)-1,k)
}

最大堆:

func SmallestKth(arr []int, k int) int {
	if k <= 0 || k > len(arr){
		return math.MaxInt64
	}
	buildHeap(arr,k)
	for i := len(arr) - 1; i >= k; i-- {
		if arr[i] < arr[0] {
			arr[0],arr[i] = arr[i],arr[0]
			heap(arr, k, 0)
		}
	}
	return arr[0]
}


func buildHeap(a []int, lens int) {
	for i := lens / 2; i >= 0; i-- {
		heap(a, lens, i)
	}
}

func heap(a []int, lens, i int) {
	left := i*2 + 1
	right := i*2 + 2
	max := i
	if left < lens && a[left] > a[max] {
		max = left
	}
	if right < lens && a[right] > a[max] {
		max = right
	}
	if i != max {
		a[i], a[max] = a[max], a[i]
		heap(a, lens, max)
	}
}

2.最小K个数

快排:

func partition(a []int, left, right int) int {
	pivot := a[left]
	j := left
	for i := left+1;i <= right;i++ {
		if a[i] < pivot {
			j++
			a[j],a[i] = a[i],a[j]
		}
	}
	a[left],a[j] = a[j],a[left]
	return j
}

func randomPartition(a []int, left,right int) int {
	random := rand.Intn(right-left+1)
	i := left+random
	a[i],a[left] = a[left],a[i]
	return partition(a,left,right)
}

func quickSelect(a []int,left,right,k int) int {
	mid := randomPartition(a,left,right)
	if mid == left+k-1 {
		return a[mid]
	} else if mid > left+k-1 {
		return quickSelect(a,left,mid-1,k)
	} else {
		return quickSelect(a,mid+1,right,k-(mid-left+1))
	}
}


func GetLeastNumbers(a []int, k int) []int {
	if k <= 0 || k > len(a) {
		return []int{}
	}
	res := make([]int,k)
	quickSelect(a,0,len(a)-1,k)
	for i := 0; i < len(res); i++ {
		res[i] = a[i]
	}
	return res
}

最大堆:

func SmallestK(arr []int, k int) []int {
	if k <= 0 || k > len(arr){
		return []int{}
	}

	buildHeap(arr,k)
	for i := len(arr) - 1; i >= k; i-- {
		if arr[i] < arr[0] {
			arr[0],arr[i] = arr[i],arr[0]
			heap(arr, k, 0)
		}
	}
	return arr[:k]
}


func buildHeap(a []int, lens int) {
	for i := lens / 2; i >= 0; i-- {
		heap(a, lens, i)
	}
}

func heap(a []int, lens, i int) {
	left := i*2 + 1
	right := i*2 + 2
	max := i
	if left < lens && a[left] > a[max] {
		max = left
	}
	if right < lens && a[right] > a[max] {
		max = right
	}
	if i != max {
		a[i], a[max] = a[max], a[i]
		heap(a, lens, max)
	}
}

3.翻转含有中文、数字、英文字母的字符串

package main

import"fmt"

func main() {
	src := "你好abc啊哈哈"
	dst := reverse([]rune(src))
	fmt.Printf("%v\n", string(dst))
}

func reverse(s []rune) []rune {
	for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
		s[i], s[j] = s[j], s[i]
	}
	return s
}

4.反转整数

func reverse(x int) int {
    res := 0
    for x != 0 {
         res = res * 10 + x % 10  
        if !(res >= -1<<31 && res <= (1<<31)-1) {
            res = 0
            break
        }  
        x /= 10
    }
    return res
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值