L1-027. 出租(Java)PAT團體程序設計天梯賽-練習集

下面是新浪微博上曾經很火的一張圖:
這裏寫圖片描述
一時間網上一片求救聲,急問這個怎麼破。其實這段代碼很簡單,index數組就是arr數組的下標,index[0]=2 對應 arr[2]=1,index[1]=0 對應 arr[0]=8,index[2]=3 對應 arr[3]=0,以此類推…… 很容易得到電話號碼是18013820100。
本題要求你編寫一個程序,爲任何一個電話號碼生成這段代碼 —— 事實上,只要生成最前面兩行就可以了,後面內容是不變的。

輸入格式:

輸入在一行中給出一個由11位數字組成的手機號碼。

輸出格式:

爲輸入的號碼生成代碼的前兩行,其中arr中的數字必須按遞減順序給出。

輸入樣例:

18013820100

輸出樣例:

int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};


先來說說思路:
1  首先將讀取的號碼存入一個字符數組
2  定義一個二維數組,遍歷號碼字符數組,將數字出現的次數,以及出現的位置存入二維數組。二維數組共10行,對應數字0-9,每行的第一列存這個數字出現的次數,後面的若干列存出現的位置。
  二維數組的列數可以根據號碼長度來定,假設最壞情況,11位數都是同一個數字,就需要12列來存儲,因爲第一列存儲出現的次數,後面纔是出現的位置。

  這裏舉個簡單的例子, 如號碼 ‘123456’, 二維數組結果爲:
第0行:[0, 0, 0, 0, 0, 0, 0]
第1行:[1, 0, 0, 0, 0, 0, 0]
第2行:[1, 1, 0, 0, 0, 0, 0]
第3行:[1, 2, 0, 0, 0, 0, 0]
第4行:[1, 3, 0, 0, 0, 0, 0]
第5行:[1, 4, 0, 0, 0, 0, 0]
第6行:[1, 5, 0, 0, 0, 0, 0]
第7行:[0, 0, 0, 0, 0, 0, 0]
第8行:[0, 0, 0, 0, 0, 0, 0]
第9行:[0, 0, 0, 0, 0, 0, 0]
  注意:第一列表示當前行索引數字出現的次數,後面若干列就是出現的位置。第一列爲 0 就表示未出現。

3   遍歷二維數組,將數字的信息存入arr數組和index數組
4   最後輸出兩個數組就行


import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        char[] phoneNum = scanner.next().toCharArray();

        // 二維數組,每一行存儲當前行索引數字的信息,行索引 0-9對應數字0-9
        // 每一行的第一列表示當前數字在號碼中出現的次數,爲0就表示不存在
        // 每一行從第二列開始,依次存儲數字在號碼中的位置
        int[][] data = new int[10][phoneNum.length + 1];

        // 設置 arr 數組長度,初始爲 0
        int arr_len = 0;

        // 對電話號碼的每一位進行處理
        for (int i = 0; i < phoneNum.length; i++) {
            // 獲得數字
            int k = phoneNum[i] - '0';

            // 如果當前數字的個數爲0,即第一次出現
            if (data[k][0] == 0) {
                // arr 數組長度加一
                arr_len++;
            }

            // 數字k出現次數加一
            data[k][0]++;
            // 爲容易理解,定義一個臨時變量存儲長度,也可以直接寫
            int len = data[k][0];
            // 依次設置數字在號碼中的位置
            data[k][len] = i;       // data[k][data[k][0]] = i;
        }

        //到這裏還不理解的話,可以把數組打印出來看看
//      System.out.println("arr_len:" + arr_len);
//      
//      for (int i = 0; i < 10; i++) {
//          System.out.print(data[i][0] + ": ");
//          for (int j = 1; j <= data[i][0]; j++) {
//              System.out.print(data[i][j] + " ");
//          }
//          System.out.println();
//      }

        // 根據 arr 長度來新建數組
        int[] arr = new int[arr_len];
        int[] index = new int[11];

        // 將二維數組的信息解析,分別存入兩個數組
        // arr 要求按數字遞減順序
        // 數字 i 從 9 開始遞減判斷, j 表示 arr 的索引
        for (int i = 9, j = 0; i >= 0; i--) {
            // 如果這個數字出現次數大於 0
            if (data[i][0] > 0) {
                // 存入 arr 數組
                arr[j] = i;

                // 獲取數字出現次數
                int len = data[i][0];

                // 出現幾次,就有幾個位置信息
                while (len > 0) {
                    // 爲了方便觀察理解,設個臨時變量 k
                    // data[i][len] 表示第 len 次出現的位置
                    int k = data[i][len];
                    // 將該數字在arr數組中的索引,按位置存入index數組
                    index[k] = j;
                    // 次數減一
                    len--;
                }

                // arr 數組索引加一
                j++;
            }
        }

        // 打印結果
        System.out.print("int[] arr = new int[]{");
        for (int i = 0; i < arr_len; i++) {
            if (i < arr_len - 1) {
                System.out.print(arr[i] + ",");
            } else {
                System.out.println(arr[i] + "};");
            }
        }

        System.out.print("int[] index = new int[]{");
        for (int i = 0; i < index.length; i++) {
            if (i < index.length - 1) {
                System.out.print(index[i] + ",");
            } else {
                System.out.println(index[i] + "};");
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章