華爲2016研發工程師編程題之刪數據

題目描述:

有一個數組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]進行計算。

輸出描述:

一行輸出最後一個被刪掉的數的原始下標位置。

輸入例子:

8

輸出例子:

6

參考代碼:

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner fin = new Scanner(System.in);
        int N = fin.nextInt();
        if(N > 1000){
            N = 1000;
        }
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < N; i++) {
            list.add(i);
        }

        while (list.size() != 1) {
            int i = 0;
            for (; i < 2; i++) {
                list.add(list.remove(0));
            }
            if (i == 2) {
                list.remove(0);
            }
        }
        System.out.println(list.get(0));
    }
}

比較高效的實現方法:

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner fin = new Scanner(System.in);
        int N = fin.nextInt();
        if(N > 1000){
            N = 1000;
        }
        ArrayList<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < N; i++) {
            list.add(i);
        }
        int index = 0;
        while (list.size() != 1) {
            index = (index + 2 + list.size()) % list.size();
            list.remove(index);
        }
        System.out.println(list.get(0));
    }
}

建議先本地調試,通過後再網上提交。

轉載請附上出處!

發佈了28 篇原創文章 · 獲贊 32 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章