1. 程式人生 > >每隔2個數刪除一個數的刪數問題

每隔2個數刪除一個數的刪數問題

問題:有一個數組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(刪除),如此迴圈直到最後一個數被刪除。

輸入:陣列的長度,如8;輸出:6

下面是我的解決辦法:

說明:countDel用來算刪除的數的個數;count用來計算兩數的間隔;i 是遍歷陣列的遊標; l(length)是陣列的長度

採用下標標記,將刪除的數的下標賦值為-1,遍歷陣列,當遇到值非-1的就用count計數,count累計為3時,說明當前的這個下標對應的數應當被刪除(對應的值置為-1),這時也要累計刪除的個數countSize並將count清0。

遍歷陣列時,當遊標 i 等於陣列長度時,模掉陣列長度,如此迴圈,直到countDel=陣列長度時,跳出遍歷迴圈,返回的 i-1  就是最後一個被刪除的數的下標。下面附上java的實現:
 

import java.util.Scanner;
 
/**
* @author Administrator
*/
 
public class CountIndex {
 
    public static void main(String[] args) {
 
      Scanner scanner = new Scanner(System.in);
 
      int length;
 
     while (scanner.hasNextInt()) {
 
            length = scanner.nextInt();
 
           int[] index = new int[length];
 
          System.out.println(coutIndex(length, index));
 
     }
 
}
 
public static int coutIndex(int l, int[] index) {
 
    int i = 0;
 
    int count = 0;
 
    int countDel = 0;
 
    while (true) {
 
        if (countDel == l) {
 
           return i - 1;
 
        }
 
       if (i == l) {
 
            i = i % l;
 
       }
 
      if (index[i] != -1) {
 
           count++;
 
      }
 
     if (count == 3) {
 
          count = 0;
 
          countDel++;
 
         index[i % l] = -1;
 
        }
 
     i++;
 
    }
 
  }
 
}

 

可以訪問的我的簡書刪數問題 https://www.jianshu.com/p/cb545942ea4c
 
 

 

轉載自:https://blog.csdn.net/qq_16036809/article/details/52193675