N个人(编号从1到N)
围成一圈数数,每当数到3的倍数时出圈,最后剩下的人的编号是多少?
- package com.other.example;
- import java.util.List;
- import java.util.LinkedList;
- public class Cycle
- {
- public static void main(String[] args)
- {
- System.out.println("该数字原来的位置是:" + cycle(50, 3));
- System.out.println("我的笨方法:" + myIdea(50, 3));
- }
- private static int cycle(int tatal, int k)
- {
- List<Integer> list = new LinkedList<Integer>();
- for(int i = 1; i <= 50; i++)
- {
- list.add(i);//自动装箱 list,add(new Integer(i));
- }
- int index = -1;
- while(list.size() > 1)
- {
- index = (index + k) % list.size();
- list.remove(index--);
- }
- return list.get(0);//自动拆箱 list.get(0).intValue();
- }
- private static int myIdea(int total, int k)
- {
- int[] arr = new int[total];
- for (int i = 1; i <= total; i++)
- {
- arr[i-1] = i;
- }
- int flag = 0;
- while(isContinue(arr))
- {
- for (int j = 0; j < arr.length; j++)
- {
- if(arr[j] != 0)
- {
- flag++;
- if(flag % k == 0)
- {
- arr[j] = 0;
- }
- }
- }
- }
- for (int i = 0; i < arr.length; i++)
- {
- if(arr[i] != 0)
- {
- return arr[i];
- }
- }
- return 0;
- }
- private static boolean isContinue(int[] arr)
- {
- int count = 0;
- for (int i = 0; i < arr.length ;i++ )
- {
- if(arr[i] != 0)
- {
- count++;
- }
- if (count>1)
- {
- return true;
- }
- }
- return false;
- }
- }