题目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};
解题思路
- 提取数字:从手机号中提取所有不同的数字(出现顺序按首次出现的先后)
- 去重并降序排列:将提取的数字去重,并按降序排列存入
arr - 生成下标数组:
- 遍历原手机号每一位数字
- 找到该数字在
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 中的索引 |
|---|---|
| 1 | 3 |
| 8 | 0 |
| 0 | 4 |
| 1 | 3 |
| 3 | 1 |
| 8 | 0 |
| 2 | 2 |
| 0 | 4 |
| 1 | 3 |
| 0 | 4 |
| 0 | 4 |
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)
总结
本题考察数组去重、排序和映射操作,理解 arr 和 index 的关系是解题关键。