• 一、题目
  • 二、解题思路
  • 三、解题代码

    一、题目

    0, 1, … , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字。求出这个圈圈里剩下的最后一个数字。

    二、解题思路

    创建一个总共有n 个结点的环形链表,然后每次在这个链表中删除第m 个结点。

    三、解题代码

    1. public static int lastRemaining(int n, int m) {
    2. if (n < 1 || m < 1) {
    3. return -1;
    4. }
    5. List<Integer> list = new LinkedList<>();
    6. for (int i = 0; i < n; i++) {
    7. list.add(i);
    8. }
    9. // 要删除元素的位置
    10. int idx = 0;
    11. while (list.size() > 1) {
    12. // 只要移动m-1次就可以移动到下一个要删除的元素上
    13. for (int i = 1; i < m; i++) {
    14. idx = (idx + 1) % list.size();
    15. }
    16. list.remove(idx);
    17. }
    18. return list.get(0);
    19. }