最近找實習, 在做Test Assignment時遇到了這麼道題, 就順便記錄下來:
說, 有1到100共100個數, 擺成一個圈. 從1開始, 每隔1, 2, 3, 4 ... 個數拿走一個數, 一直循環, 最後剩下幾? 具體的講就是一開始(隔0個數)把 1 拿走, 隔1個數(2)把3拿走, 再隔2個數(4, 5)把6拿走, 再隔3個數(7, 8, 9)把10拿走. 第一圈數到100之後接著從2開始數, 直到最後剩下1個數為止, 請問最後剩下幾? 如果是1到n呢?
1 public static int selectNumber(int n) { 2 3 int result = -1; 4 ArrayList<Integer> nums = new ArrayList<Integer>(); 5 int index = 0; // this variable is used to remove numbers from list 6 int count = 0; // count is used to count which numbers should be remove 7 int pIndex = 0; // this is used to record previous index 8 9 // generate a list contains numbers from 1 to n 10 for(int i = 1; i <= n; i++) { 11 nums.add(i); 12 } 13 14 while(nums.size() > 1) { 15 16 while(index < nums.size()) { 17 nums.remove(index); 18 count++; 19 pIndex = index; 20 index += count; 21 } 22 23 index = count - (nums.size() - pIndex); 24 25 while(index > nums.size() - 1) { 26 index = index - nums.size(); 27 } 28 } 29 30 result = nums.get(0); 31 return result; 32 } 33 34 public static void main(String[] args) { 35 int surviver = selectNumber(100); 36 System.out.println("The surviver is: " + surviver); 37 }
以上就是我的解決方案, 最後留下的數是31