题解 | #孩子们的游戏(圆圈中最后剩下的数)#
孩子们的游戏(圆圈中最后剩下的数)
https://www.nowcoder.com/practice/f78a359491e64a50bce2d89cff857eb6
看题解里面的递归处理,代码极其简单,但实在不好理解,我这个凡人大脑想破了脑袋还是觉得那种方法理解起来有点隔靴搔痒,
所以自己用了以下这种人类大脑的思考方式,来解决;思路就是在数组里来回循环走,每次走m步,找到每次要删除的下标。
import java.util.*; public class Solution { public int LastRemaining_Solution(int n, int m) { if (n == 1 || m == 1) { return n - 1; } else { LinkedList<Integer> lli = new LinkedList<>();//把所有的孩子放在链表中 for (int i = 0; i < n; i++) { lli.add(i); } int step = m; int removeindex = 0;//设定要删除的孩子的初始值 while (lli.size() > 1) {//每次删除一个孩子,直到剩最后一个 //寻找要删除的孩子的编号,假设总孩子数量是多于m的,那么下一个要删除的编号就是removeindex+step-1 int nextindex = removeindex + step - 1; //若这个编号大于数组最后一个编号的处理(这里要用while不能用if,因为可能不止需要处理一次) while (nextindex > lli.size() - 1) { //则多余的从0开始再数nextindex-(lli.size()-1)个,那么此时的下标就是nextindex-(lli.size()-1)-1 nextindex = nextindex - lli.size(); } removeindex = nextindex; lli.remove(removeindex); } return lli.get(0); } } }