方法1:用环形链表的思想模拟圆圈 假设当前在begin位置,那么从它开始(包含),第m个数字(报 m - 1)便是 list 中 下标为 (begin + m - 1) % size,然后以(begin + m - 1) % size 作为begin位置,迭代,直至list中只有一个元素为止。
方法二:公式法,具体见剑指offer
代码实现
方法1:
publicint LastRemaining_Solution2(int n, int m) {
if (n <= 0 || m <= 0) {
return -1;
}
LinkedList<Integer> list = new LinkedList<>();
for (int i = 0; i < n; i++) {
list.add(i);
}
//初始化起点int begin = 0;
while (list.size() > 1) {
//根据当前点计算下一出环的点int temp = (begin + m - 1) % list.size();
//出环list.remove(temp);
//出环处重新作为起点,迭代
begin = temp;
}
returnlist.get(0);
}
公式法:
public int LastRemaining_Solution(int n, intm) {
if (n <= 0 || m <= 0) {
return -1;
}
intlast = 0;
for (int i = 2; i <= n; i++) {
last = (last + m) % i;
}
returnlast;
}