top1编程
← 返回题目
题解

【入门】请求出一个3位数打乱次序后能组成的最小的3位数是多少?

1 条题解

  • 0
    @ 2026-7-31 11:28:12

    解题思路

    题目要求把一个三位数的三个数字重新排列,组成一个最小的三位数(位数不能变,所以首位不能是 0)。

    思路分三步:

    1. 拆数字:把百位、十位、个位分别拆出来,比如 312 → 3, 1, 2
    2. 排序:三个数字从小到大排好,这样组成的数尽量小,比如 1, 2, 3
    3. 处理首位 0:如果最小的数字是 0(比如 230 拆成 2, 3, 0),0 不能放首位,否则就不是三位数了。这时把 0 和后面第一个非 0 数字交换位置
    4. 拼数:按百位、十位、个位拼回一个数

    为什么首位不能是 0? 因为 0 开头的话,比如 023,实际上就是 23,只有两位数,不符合要求。230 拆开是 2,3,0,排好是 0,2,3,0 放首位变成 023 不对,要把 0 和 2 交换,得到 203。

    参考代码

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
    
        // 拆出三位数的百位、十位、个位
        int digits[3];
        digits[0] = n / 100;
        digits[1] = (n / 10) % 10;
        digits[2] = n % 10;
    
        // 三个数字从小到大排序
        sort(digits, digits + 3);
    
        // 首位不能是 0,找到第一个非 0 数字交换到首位
        if (digits[0] == 0) {
            for (int i = 1; i < 3; i++) {
                if (digits[i] != 0) {
                    swap(digits[0], digits[i]);
                    break;
                }
            }
        }
    
        // 拼成最小的三位数
        int ans = digits[0] * 100 + digits[1] * 10 + digits[2];
        cout << ans << endl;
    
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(1),只有 3 个数字,排序很快
    • 空间复杂度:O(1)
    • 1