下面是新浪微博上曾經很火的一張圖:
一時間網上一片求救聲,急問這個怎麼破。其實這段代碼很簡單,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] + "};");
}
}
}
}