给定一个三位数整型数组,要求不改变百位和个位,仅提取所有数的十位(中间数字),将其升序排序后,再分别放回对应位置,从而生成新数组。
在实际编程中,有时需要对复合数值的某一位进行独立处理——例如本题要求:仅对每个三位数的十位数字(即中间一位)进行全局升序排序,而百位与个位保持原位置不变。注意,这不是按整个数字排序,也不是对每位分别排序,而是“抽取→排序→回填”三步策略。
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; // 如 540 → (540/10)%10 = 54%10 = 4
}
// 步骤2:对十位数组排序(升序)
Arrays.sort(mids); // 排序后:[0, 4, 8] ← 对应原数组十位 4,8,0 的升序结果
// 步骤3:用排序后的十位重建每个数
for (int i = 0; i < numbers.length; i++) {
int hundreds = (numbers[i] / 100) * 100; // 百位部分(如 540 → 500)
int tens = mids[i] * 10; // 新十位(如 0 → 0, 4 → 40, 8 → 80)
int units = numbers[i] % 10; // 个位(如 540 → 0)
numbers[i] = hundreds + tens + units;
System.out.println("numbers[" + i + "] = " + numbers[i]);
}
// 输出:500, 944, 982 ← 符合预期
}
}此方法逻辑清晰、时间复杂度为 O(n log n)(主导于排序),空间复杂度 O(n),是处理“单数位局部排序”问题的标准范式。