You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.2 KiB
53 lines
1.2 KiB
package cap3
|
|
|
|
// _node 链表节点,单向循环链表
|
|
type _node struct {
|
|
Value int
|
|
Next *_node
|
|
}
|
|
|
|
// 初始化长度为n的环
|
|
func _initCircle(n int) *_node {
|
|
head := &_node{0, nil}
|
|
current := head
|
|
for i := 1; i < n; i++ {
|
|
newNode := &_node{i, nil}
|
|
current.Next = newNode
|
|
current = newNode
|
|
}
|
|
|
|
// 头尾相连成环
|
|
current.Next = head
|
|
return head
|
|
}
|
|
|
|
// Ex17Normal 小朋友游戏(约瑟夫问题),一般解法(非数学解法),n: 总人数(节点数),k:出队报数
|
|
func Ex17Normal(n, k int) int {
|
|
circle := _initCircle(n)
|
|
current := circle
|
|
for current.Next != current {
|
|
for i := 1; i < k-1; i++ {
|
|
current = current.Next
|
|
}
|
|
|
|
// 报到k-1时移除下一个节点
|
|
next := current.Next
|
|
current.Next = next.Next
|
|
current = current.Next
|
|
|
|
// 避免内存泄露
|
|
next.Next = nil
|
|
}
|
|
|
|
return current.Value
|
|
}
|
|
|
|
// Ex17Math 小朋友游戏(约瑟夫问题),公式递推解法,n: 总人数(节点数),k:出队报数
|
|
func Ex17Math(n, k int) int {
|
|
idx := 0
|
|
for i := 2; i <= n; i++ {
|
|
idx = (idx + k) % i
|
|
}
|
|
|
|
return idx
|
|
}
|
|
|