程序常用算法

给定一个数组,找最大元素值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import (
"fmt"
)

func main() {
var arr = []int{0, 1, 2, 45, 3, 4, 5, 6, 7, 8, 9, 10}
var beginPtr = 0
var endPtr = len(arr) - 1

for beginPtr < endPtr { // 知道两个位置重叠,这个数即为最大值(最小值)
if arr[beginPtr] > arr[endPtr] {
endPtr--
} else {
beginPtr++
}
}

fmt.Println("max value:", arr[beginPtr])
}

给定一个数组,随机找其中几个不重复的元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

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

func main() {
rand.Seed(time.Now().Unix())
var arr = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var total = len(arr)
for i := 0; i < 4; i++ {
j := rand.Int()%total + i // 从剩余元素中随机抽取一个元素
arr[i], arr[j] = arr[j], arr[i] // 将随机抽取的元素替换掉开头的元素
total--
}
fmt.Println(arr)
}
  • 任何数字和某个数字a求余时,其结果不会超过a
  • rand.Int()%total,随着total递减,所以改表达式求值结果最大值不会超过剩余元素个数
  • rand.Int()%total + i,加i的目的是让元素位置往后移动
  • arr[i], arr[j] = arr[j], arr[i],后面的随机数会替换掉前面的数字