
给定一个三位数整型数组,要求不改变百位和个位,仅提取所有数的十位(中间数字),将其升序排序后,再分别放回对应位置,从而生成新数组。
在实际编程中,有时需要对复合数值的某一位进行独立处理——例如本题要求:仅对每个三位数的十位数字(即中间一位)进行全局升序排序,而百位与个位保持原位置不变。注意,这不是按整个数字排序,也不是对每位分别排序,而是“抽取→排序→回填”三步策略。
✅ 解决思路
- 提取十位数字:对每个三位数 n,十位 = (n / 10) % 10(先整除10去掉个位,再对10取模得十位);
- 单独排序该十位数组:使用 Arrays.sort() 升序排列;
- 重建原数组:对第 i 个数,用 n / 100 * 100 保留百位、mids[i] * 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; // 如 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 ← 符合预期
}
}⚠️ 注意事项
- 输入约束:该解法严格依赖“所有数字均为三位正整数(100–999)”,否则 (n/10)%10 可能提取错误位(如两位数会误取十位为个位);
- 空间优化:题目强调“使用一个数组”,本方案仅额外申请 mids[] 存储中间数字,未修改原 numbers[] 的存储结构,符合要求;
- 可扩展性:若需支持任意位数或降序,可改用 Integer[] + Comparator,但本题升序+三位数场景下,int[] + Arrays.sort() 最简洁高效。
此方法逻辑清晰、时间复杂度为 O(n log n)(主导于排序),空间复杂度 O(n),是处理“单数位局部排序”问题的标准范式。










