Golang实现线段切割法抢红包
算法参见 抢红包算法代码注意,我这里用了k8s的rand.IntnRange,也可以用内置的math/rand,把我代码里的相关注释取消就可以了package mainimport ("fmt""k8s.io/apimachinery/pkg/util/rand"//"math/rand""sort")func main() {fmt.Println(hongbao(9, 6))}func hon
·
算法
参见 抢红包算法
代码
注意
- 我这里用了
k8s的rand.IntnRange
,也可以用内置的math/rand,把我代码里的相关注释取消就可以了 - 我这里金额采用的是整数,是以分为单位的
package main
import (
"fmt"
"k8s.io/apimachinery/pkg/util/rand"
//"math/rand"
"sort"
)
func main() {
fmt.Println(hongbao(9, 6))
}
func hongbao(money, count int) []int {
if count <= 0 || money < count {
panic("错误的参数")
}
if count == 1 {
return []int{money}
}
result := make([]int, count)
if count == money { // 这种情况冲突特别多,10块钱发给10个人的时候,耗时特别长
for i := 0; i < len(result); i++ {
result[i] = 1
}
return result
}
set := make(map[int]struct{})
setKey := make([]int, 0)
//rand.Seed(time.Now().UnixNano())
for len(set) < count-1 { // 分割线段,只需要count-1
randNum := rand.IntnRange(1,money-1)
//randNum := rand.Intn(money-2) + 1
if _, ok := set[randNum]; ok {
continue
}
set[randNum] = struct{}{}
setKey = append(setKey, randNum)
}
sort.Slice(setKey, func(i, j int) bool {
return setKey[i] < setKey[j]
})
setKey = append(setKey, money)
result[0] = setKey[0]
for i := 1; i < len(setKey); i++ {
result[i] = setKey[i] - setKey[i-1]
}
return result
}
更多推荐
已为社区贡献11条内容
所有评论(0)