本文介绍一种高效方法:提取所有三位数的十位数字(即中间位),单独排序后,再将其重新组合回原数字,实现“仅中间数字有序”而百位、个位完全不变。
在处理三位数数组时,有时需求并非对整个数值排序,而是仅按中间数字(十位)升序排列,同时严格保留每个数的百位与个位不变。例如输入 [540, 984, 902],其十位数字分别为 4, 8, 0;将这些中间数字升序排列得 [0, 4, 8],再依次替换回原位置,得到输出 [500, 944, 982]。
现原理三位数 n 的各位可拆解为:
因此,重组公式为:
newNum = (n / 100) * 100 + sortedMid * 10 + (n % 10)
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]
}
}通过这种分离-排序-重组的策略,我们精准实现了“仅中间数字有序”的业务逻辑,兼顾清晰性、效率与可维护性。