下面是新浪微博上曾经很火的一张图:
一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,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] + "};");
}
}
}
}