思路:
1、利用链表,每次移动m-1次,删除元素即可
2、利用公式
代码:
package com.datastructure.link;
import java.util.LinkedList;
import java.util.List;
/**
* 圆圈中剩下的数字
*
* 题目:0, 1, … , n-1 这n个数字排成一个圈圈,
* 从数字0开始每次从圆圏里删除第m个数字。求出这个圈圈里剩下的最后一个数字。
*
*/
public class NumberLeftInCircle {
static class Node {
int value;
Node next;
public Node(int value) {
this.value = value;
}
@Override
public String toString() {
if (this.next == null) {
return String.valueOf(this.value);
}
return this.value + "->" + this.next.toString();
}
}
/**
*
* 使用环链表,每次删除第m个元素
*
*
*/
public static int lastRemaining(int n, int m) {
if (n <= 1 || n < m ) {
return -1;
}
List<Integer> tmp = new LinkedList<>();
for (int i=0; i<n; i++) {
tmp.add(i);
}
int idx = 0;
while (tmp.size() > 1) {
for (int i = 0; i < m-1; i++) {
idx = (idx + 1) % tmp.size();
}
tmp.remove(idx);
}
return tmp.get(0);
}
/**
* 使用公式
*/
public static int left (int n, int m) {
if (n <= 1 || n < m ) {
return -1;
}
int last = 0;
for (int i = 2; i <= n; i++) {
last = (last + m) % i;
}
return last;
}
public static void main(String args[]) {
System.out.println("5 elements remove the 2 element, left: " + lastRemaining(5, 2));
System.out.println("5 elements remove the 2 element, left: " + left(5, 2));
}
}
参考:
约瑟夫环问题:https://blog.csdn.net/derrantcm/article/details/46798717