WenJieWangFlyToWorld

导航

华为机试-删数

有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。
以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。

输入描述:
每组数据为一行一个整数n(小于等于1000),为数组成员数,如果大于1000,则对a[999]进行计算。


输出描述:
一行输出最后一个被删掉的数的原始下标位置。

 程序实现

  1. import java.util.LinkedList;  
  2. import java.util.Queue;  
  3. import java.util.Scanner;  
  4.   
  5. /** 
  6.  * 有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。 
  7.  * 以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除), 
  8.  * 如此循环直到最后一个数被删除。 
  9.  *  
  10.  * 输入描述: 每组数据为一行一个整数n(小于等于1000),为数组成员数,如果大于1000,则对a[999]进行计算。 
  11.  *  
  12.  *  
  13.  * 输出描述: 一行输出最后一个被删掉的数的原始下标位置。 
  14.  *  
  15.  */  
  16.   
  17. public class Main {  
  18.   
  19.     public static void main(String[] args) {  
  20.         Scanner scanner = new Scanner(System.in);  
  21.         while (scanner.hasNext()) {  
  22.             int num = scanner.nextInt();  
  23.             if (num > 1000) {  
  24.                 num = 1000;  
  25.             }  
  26.             int index = findLast(num);  
  27.             System.out.println(index);  
  28.         }  
  29.   
  30.     }  
  31.   
  32.     private static int findLast(int num) {  
  33.         Queue<Integer> queue = new LinkedList<>();  
  34.   
  35.         for (int i = 0; i < num; i++) {  
  36.             queue.add(i);  
  37.         }  
  38.         int h = 0;  
  39.         int out = 0;  
  40.         while (!queue.isEmpty()) {  
  41.             out = queue.poll();  
  42.             h++;  
  43.             if (h < 3) {  
  44.                 queue.add(out);  
  45.             } else {  
  46.                 h = 0;  
  47.             }  
  48.         }  
  49.   
  50.         return out;  
  51.     }  
  52.   
  53. }  

posted on 2017-07-13 09:28  WenjieWangFlyToWorld  阅读(113)  评论(0编辑  收藏  举报