L1-027 出租(20分)[java][python]

4 阅读2分钟

题目ID:L1-027 分数:20分 语言:Java / Python

题目描述

给定一个手机号码,生成一段Java代码的前两行。index 数组就是 arr 数组的下标,需要根据电话号码生成对应的 arr 数组(递减顺序)和 index 数组。

输入格式

输入在一行中给出一个由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. 去重并降序排列:将提取的数字去重,并按降序排列存入 arr
  3. 生成下标数组
    • 遍历原手机号每一位数字
    • 找到该数字在 arr 中的位置(索引),存入 index

Java 实现关键

  • LinkedHashSet 保持插入顺序(首次出现顺序)
  • Integer.parseInt() 将字符转为数字
  • Arrays.sort() 和逆序遍历实现降序

代码实现

Java

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String phone = br.readLine().trim();

        // 提取所有不同的数字(保持首次出现顺序)
        LinkedHashSet<Integer> set = new LinkedHashSet<>();
        for (char c : phone.toCharArray()) {
            set.add(c - '0');
        }

        // 转为列表并降序排列
        List<Integer> list = new ArrayList<>(set);
        Collections.sort(list, Collections.reverseOrder());

        // arr 数组
        System.out.print("int[] arr = new int[]{");
        for (int i = 0; i < list.size(); i++) {
            if (i > 0) System.out.print(",");
            System.out.print(list.get(i));
        }
        System.out.println("};");

        // index 数组
        System.out.print("int[] index = new int[]{");
        for (int i = 0; i < phone.length(); i++) {
            if (i > 0) System.out.print(",");
            int digit = phone.charAt(i) - '0';
            // 找到该数字在 arr 中的索引
            System.out.print(list.indexOf(digit));
        }
        System.out.println("};");
    }
}

Python

phone = input().strip()

# 提取所有不同的数字(保持首次出现顺序)
seen = []
for c in phone:
    d = int(c)
    if d not in seen:
        seen.append(d)

# 降序排列
arr = sorted(seen, reverse=True)

# 输出 arr(注意是方括号 [],不是大括号)
print(f"int[] arr = new int[]{{{','.join(map(str, arr))}}};")

# 输出 index(注意是方括号 [],不是大括号)
index = [arr.index(int(c)) for c in phone]
print(f"int[] index = new int[]{{{','.join(map(str, index))}}};")

运行验证

样例验证

输入18013820100

不同数字(首次出现顺序):1, 8, 0, 3, 2 降序排列(arr):8, 3, 2, 1, 0

数字在 arr 中的索引
13
80
04
13
31
80
22
04
13
04
04

index:3,0,4,3,1,0,2,4,3,4,4

输出

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

复杂度分析

  • 时间复杂度:O(N + D²),其中 N=11 为手机号长度,D 为不同数字个数(最多10个)。list.indexOf() 为 O(D),共调用 N 次。
  • 空间复杂度:O(D)

总结

本题考察数组去重、排序和映射操作,理解 arrindex 的关系是解题关键。