题解
【入门】请求出一个3位数打乱次序后能组成的最小的3位数是多少?
1 条题解
-
0
解题思路
题目要求把一个三位数的三个数字重新排列,组成一个最小的三位数(位数不能变,所以首位不能是 0)。
思路分三步:
- 拆数字:把百位、十位、个位分别拆出来,比如 312 → 3, 1, 2
- 排序:三个数字从小到大排好,这样组成的数尽量小,比如 1, 2, 3
- 处理首位 0:如果最小的数字是 0(比如 230 拆成 2, 3, 0),0 不能放首位,否则就不是三位数了。这时把 0 和后面第一个非 0 数字交换位置
- 拼数:按百位、十位、个位拼回一个数
为什么首位不能是 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