队列解决约瑟夫环

普通队列:

func Ring(n, m int) int {
	if n == 0 {
		return -1
	}
	if n == 1 {
		return 0
	}
	queue := make([]int,n)
	for i := 0; i < n; i++ {
		queue[i] = i
	}
	count := 1
	for len(queue) > 1 {
		if count == m {
			count = 1
			queue = queue[1:]
		} else {
			count++
			queue = append(queue, queue[0])
			queue = queue[1:]
		}
	}
	return queue[0]
}

循环队列:

func Ring2(n,m int) int {
	queue := make([]int,n)
	for i := 0; i < n; i++ {
		queue[i] = i
	}
	var front,rear = 0,n
	for {
		if rear - front == 0 {
			break
		}
		for i := 0; i < m-1;i++ {
			front = (front+1) % n
			rear = (rear+1) % n
			queue[rear] = queue[front]
		}
		front = (front+1) % n
	}
	return queue[front] - 1
}

猜你喜欢

转载自blog.csdn.net/boiled_water123/article/details/109196414