本文介绍一种高效方法:提取所有三位数的十位数字,单独排序后,再将其按顺序重新嵌入原数组各数的十位位置,百位和个位保持不变。全程仅使用一个原始数组,无需额外存储结果数组。
在处理整数数组时,有时需求并非对整个数值排序,而是仅针对某一位数字(如十位)进行排序,同时严格保留其余数位(百位、个位)不变。例如输入 [540, 984, 902],其十位数字依次为 4, 8, 0;将这三个十位数升序排列得 0, 4, 8,再分别替换回原位置,得到输出 [500, 944, 982]。
该问题的关键在于:
以下是完整的 Java 实现(兼容 JDK 8+):
import java.util.Arrays;
public class SortMiddleDigit {
public static void sortTensPlace(int[] numbers) {
if (numbers == null) return;
// 步骤1:提取所有十位数字
int[] tens = new int[numbers.length];
for (int i = 0; i < numbers.length; i++) {
tens[i] = (numbers[i] / 10) % 10; // 安全适用于三位数(100–999)
}
// 步骤2:对十位数组排序(升序)
Arrays.sort(tens);
// 步骤3:按排序后的十位值,逐个重建原数组元素
for (int i = 0; i < numbers.length; i++) {
int hundreds = numbers[i] / 100;
int units = numbers[i] % 10;
numbers[i] = hundreds * 100 + tens[i] * 10 + units;
}
}
// 示例用法
public static void main(String[] args) {
int[] arr = {540, 984, 902};
System.out.println("Before: " + Arrays.t
oString(arr));
sortTensPlace(arr);
System.out.println("After: " + Arrays.toString(arr));
// 输出:Before: [540, 984, 902]
// After: [500, 944, 982]
}
}✅ 注意事项:
总结:通过“拆解—排序—重组”三步策略,我们以清晰、可读、低侵入的方式实现了对特定数位的独立排序,既满足题设“仅用一个数组”的约束,又保持了算法的健壮性与工程实用性。