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
}