
本文介绍一种高效方法:提取所有三位数的十位数字(即中间位),单独排序后,再将其重新组合回原数字,实现“仅中间数字有序”而百位、个位完全不变。
在处理三位数数组时,有时需求并非对整个数值排序,而是仅按中间数字(十位)升序排列,同时严格保留每个数的百位与个位不变。例如输入 [540, 984, 902],其十位数字分别为 4, 8, 0;将这些中间数字升序排列得 [0, 4, 8],再依次替换回原位置,得到输出 [500, 944, 982]。
实现原理
三位数 n 的各位可拆解为:
- 百位:n / 100
- 十位(中间位):(n / 10) % 10
- 个位:n % 10
因此,重组公式为:
newNum = (n / 100) * 100 + sortedMid * 10 + (n % 10)
完整 Java 示例代码
import java.util.Arrays;
public class SortMiddleDigit {
public static void main(String[] args) {
int[] numbers = {540, 984, 902};
// 步骤1:提取所有中间数字(十位)
int[] mids = new int[numbers.length];
for (int i = 0; i < numbers.length; i++) {
mids[i] = (numbers[i] / 10) % 10; // 取十位
}
// 步骤2:对中间数字单独排序(升序)
Arrays.sort(mids);
// 步骤3:用排序后的中间数字重建原数组
for (int i = 0; i < numbers.length; i++) {
int hundreds = (numbers[i] / 100) * 100;
int units = numbers[i] % 10;
numbers[i] = hundreds + mids[i] * 10 + units;
}
// 输出结果
System.out.println(Arrays.toString(numbers)); // [500, 944, 982]
}
}注意事项
- ✅ 仅适用于严格三位正整数(100–999),否则 (n/10)%10 可能无法正确提取十位;
- ✅ 时间复杂度为 O(n log n)(由 Arrays.sort() 主导),空间复杂度 O(n)(额外存储中间数字);
- ⚠️ 若需稳定排序(相同十位时保持原始相对顺序),应改用索引映射或自定义稳定排序逻辑;
- ? 该方案复用原数组,符合“只用一个数组”的要求——中间数字仅临时存于辅助数组 mids[],最终结果写回 numbers[]。
通过这种分离-排序-重组的策略,我们精准实现了“仅中间数字有序”的业务逻辑,兼顾清晰性、效率与可维护性。










