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] + "};");
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34732088/article/details/79802576