给定一个正整数n,请将n中的每位数字重新排列并组成一个新数, 要求新数的值要小于n,请找出所有符合要求的新数中最大的那个正整数,如果不存在这样的正整数,则输出-1。 例1:n=312,312中每位上的数字依次是3、1、2,重新排列组成的新数有321、231、213、 132、123,新数中小于312的有231、213、132、123,其中符合要求的最大正整数是231; 例2:n=123,123中每位上的数字依次是1、2、3,重新排列组成的新数有312、321、231、 213、132,新数中不存在小于123的正整数,故输出-1。 输入 输入一个正整数 𝑛 ( 1 ≤ 𝑛 < 2 63 ) 输出 输出一个正整数,表示符合要求的最大正整数 样例输入 复制 312 样例输出 复制 231
```cpp #include <iostream> #include <string> #include <algorithm> #include <climits> using namespace std; long long findMaxSmallerNumber(long long n) { string s = to_string(n); int len = s.length(); long long result = -1; // 从右向左找到第一个可以交换的位置 for (int i = len - 2; i >= 0; i--) { // 在i的右侧找到比s[i]小的最大数字 char maxSmaller = '0' - 1; int maxIndex = -1; for (int j = i + 1; j < len; j++) { if (s[j] < s[i] && s[j] > maxSmaller) { maxSmaller = s[j]; maxIndex = j; } } // 如果找到了可以交换的数字 if (maxIndex != -1) { // 交换这两个数字 swap(s[i], s[maxIndex]); // 将i位置之后的数字按降序排列 sort(s.begin() + i + 1, s.end(), greater<char>()); // 转换为数字并检查是否小于n long long candidate = stoll(s); if (candidate < n) { result = candidate; break; } // 恢复原始字符串继续搜索 s = to_string(n); } } return result; } int main() { long long n; cin >> n; cout << findMaxSmallerNumber(n) << endl; return 0; } ``` 代码说明: 1. 算法思路: - 将数字转换为字符串便于处理 - 从右向左找到第一个可以交换的位置(当前位置的数字大于右侧某个数字) - 在当前位置右侧找到比当前数字小的最大数字进行交换 - 交换后,将当前位置之后的数字按降序排列,确保得到的是小于原数的最大数 2. 关键步骤: - 使用`to_string()`将数字转为字符串 - 双重循环查找可交换的位置 - 使用`swap()`进行字符交换 - 使用`sort()`配合`greater<char>()`进行降序排列 - 使用`stoll()`将字符串转回长整型 3. 边界情况: - 输入为个位数时,直接返回-1 - 数字已经是最小排列时,返回-1 - 处理大数时使用`long long`类型 4. 时间复杂度:O(n²),其中n是数字的位数 5. 空间复杂度:O(n),用于存储字符串 示例验证: - 输入:312 → 输出:231 - 输入:123 → 输出:-1 - 输入:21 → 输出:12 - 输入:1 → 输出:-1 [2026-01-11 13:31:00 | AI问答 | 643点数解答]
- [DeepSeek] 给定一个正整数n,请将n中的每位数字重新排列并组成一个新数, 要求新数的值要小于n,请找出所有符合要求的新数中最大的那个正整数,如果不存在这样的正整数,则输出-1。 例1:n=312,312中每位上的数字依次是3、1、2,重新排列组成的新数有321、231、213、 132、123,新数中小于312的有231、213、132、123,其中符合要求的最大正整数是231; 例2:n=123,123中每位上的数字依次是1、2、3,重新排列组成的新数有312、321、231、 213、132,新数中不存在小于123的正整数,故输出-1。 输入 输入一个正整数 𝑛 ( 1 ≤ 𝑛 < 2 63 ) 输出 输出一个正整数,表示符合要求的最大正整数 样例输入 复制 312 样例输出 复制 231(643点数解答 | 2026-01-11 13:31:00)27
- [字节豆包] 输入一个有符号整数n,将n中的数字部分反转后的结果。 输入格式: "%d" 输出格式: "%d\n" 输入样例1: 123 输出样例1: 321 输入样例2: -123 输出样例2: -321 输入样例2: -123 输出样例2: -321 输入样例3: -130 输出样例3: -31(190点数解答 | 2024-09-29 11:19:48)221
- [字节豆包] 输入一个有符号整数n,将n中的数字部分反转后的结果。 输入格式: "%d" 输出格式: "%d\n" 输入样例1: 123 输出样例1: 321 输入样例2: -123 输出样例2: -321 输入样例2: -123 输出样例2: -321 输入样例3: -130 输出样例3: -31(188点数解答 | 2024-09-29 11:21:26)343
- [字节豆包] 7-1 句子反转 分数 30 作者 陈宇璟 单位 浙江大学 给定一行句子,每个词之间用空格隔开,要么是全小写英文单词,要么是全大写英文单词,要么是自然数。 要求将这些单词倒序输出。而且对于每个单词,如果是小写词,应当转为大写;如果是大写词,应当转为小写;如果是自然数,应该倒转输出。 举一个例子: we choose to go 2 the 123 moon 程序应当输出: moon 321 the 2 go to choose we 输入格式 仅一行,即需要反转的句子。 输出格式 仅一行,表示程序对句子的处理结果。 说明/提示 样例解释 首先应当按单词逆序,即: moon 123 the 2 go to choose we 小写变大写、大写变小写、倒转自然数之后,得到最终结果: moon 321 the 2 go to choose we 数据规模与约定 对于 100% 的数据,句子中包含的单词数量不超过 1000,每个单词长度不超过 6。 输入样例: we choose to go 2 the 123 moon 输出样例: moon 321 the 2 go to(131点数解答 | 2024-11-11 16:44:49)398
- [字节豆包] 使用c| 7-1 句子反转 分数 30 作者 陈宇璟 单位 浙江大学 给定一行句子,每个词之间用空格隔开,要么是全小写英文单词,要么是全大写英文单词,要么是自然数。 要求将这些单词倒序输出。而且对于每个单词,如果是小写词,应当转为大写;如果是大写词,应当转为小写;如果是自然数,应该倒转输出。 举一个例子: we choose to go 2 the 123 moon 程序应当输出: moon 321 the 2 go to choose we 输入格式 仅一行,即需要反转的句子。 输出格式 仅一行,表示程序对句子的处理结果。 说明/提示 样例解释 首先应当按单词逆序,即: moon 123 the 2 go to choose we 小写变大写、大写变小写、倒转自然数之后,得到最终结果: moon 321 the 2 go to choose we 数据规模与约定 对于 100% 的数据,句子中包含的单词数量不超过 1000,每个单词长度不超过 6。 输入样例: we choose to go 2 the 123 moon 输出样例: moon 321 the 2(393点数解答 | 2024-11-11 16:45:21)534
- [百度文心] -1 句子反转 分数 30 作者 陈宇璟 单位 浙江大学 给定一行句子,每个词之间用空格隔开,要么是全小写英文单词,要么是全大写英文单词,要么是自然数。 要求将这些单词倒序输出。而且对于每个单词,如果是小写词,应当转为大写;如果是大写词,应当转为小写;如果是自然数,应该倒转输出。 举一个例子: we choose to go 2 the 123 moon 程序应当输出: moon 321 the 2 go to choose we 输入格式 仅一行,即需要反转的句子。 输出格式 仅一行,表示程序对句子的处理结果。 说明/提示 样例解释 首先应当按单词逆序,即: moon 123 the 2 go to choose we 小写变大写、大写变小写、倒转自然数之后,得到最终结果: moon 321 the 2 go to choose we 数据规模与约定 对于 100% 的数据,句子中包含的单词数量不超过 1000,每个单词长度不超过 6。 输入样例: we choose to go 2 the 123 moon 输出样例: moon 321 the 2 go to(451点数解答 | 2025-10-25 11:33:27)70
- [百度文心] C-1 句子反转 分数 30 作者 陈宇璟 单位 浙江大学 给定一行句子,每个词之间用空格隔开,要么是全小写英文单词,要么是全大写英文单词,要么是自然数。 要求将这些单词倒序输出。而且对于每个单词,如果是小写词,应当转为大写;如果是大写词,应当转为小写;如果是自然数,应该倒转输出。 举一个例子: we choose to go 2 the 123 moon 程序应当输出: moon 321 the 2 go to choose we 输入格式 仅一行,即需要反转的句子。 输出格式 仅一行,表示程序对句子的处理结果。 说明/提示 样例解释 首先应当按单词逆序,即: moon 123 the 2 go to choose we 小写变大写、大写变小写、倒转自然数之后,得到最终结果: moon 321 the 2 go to choose we 数据规模与约定 对于 100% 的数据,句子中包含的单词数量不超过 1000,每个单词长度不超过 6。 输入样例: we choose to go 2 the 123 moon 输出样例: moon 321 the 2 go to,用C语言完成(1010点数解答 | 2025-10-25 11:34:26)80
- [阿里通义] C-1 句子反转 分数 30 作者 陈宇璟 单位 浙江大学 给定一行句子,每个词之间用空格隔开,要么是全小写英文单词,要么是全大写英文单词,要么是自然数。 要求将这些单词倒序输出。而且对于每个单词,如果是小写词,应当转为大写;如果是大写词,应当转为小写;如果是自然数,应该倒转输出。 举一个例子: we choose to go 2 the 123 moon 程序应当输出: moon 321 the 2 go to choose we 输入格式 仅一行,即需要反转的句子。 输出格式 仅一行,表示程序对句子的处理结果。 说明/提示 样例解释 首先应当按单词逆序,即: moon 123 the 2 go to choose we 小写变大写、大写变小写、倒转自然数之后,得到最终结果: moon 321 the 2 go to choose we 数据规模与约定 对于 100% 的数据,句子中包含的单词数量不超过 1000,每个单词长度不超过 6。 输入样例: we choose to go 2 the 123 moon 输出样例: moon 321 the 2 go to,用C语言完成 (712点数解答 | 2025-10-25 11:35:19)74
- [字节豆包] 用C++给定一个整数 N N,判断其正负。如果 N > 0 N>0,输出 p o s i t i v e positive; 如果 N = 0 N=0,输出 z e r o zero; 如果 N < 0 N<0,输出 n e g a t i v e negative。 输入 一个整数 N ( − 10 9 ≤ N ≤ 10 9 ) N(−10 9 ≤N≤10 9 )。 输出 如果 N > 0 N>0, 输出 p o s i t i v e positive; 如果 N = 0 N=0, 输出 z e r o zero; 如果 N < 0 N<0, 输出 n e g a t i v e negative。 回答篇幅:越详细越好(610点数解答 | 2026-01-24 22:28:14)34
- [字节豆包] 用C++给定一个整数 N N,判断其正负。如果 N > 0 N>0,输出 p o s i t i v e positive; 如果 N = 0 N=0,输出 z e r o zero; 如果 N < 0 N<0,输出 n e g a t i v e negative。 输入 一个整数 N ( − 10 9 ≤ N ≤ 10 9 ) N(−10 9 ≤N≤10 9 )。 输出 如果 N > 0 N>0, 输出 p o s i t i v e positive; 如果 N = 0 N=0, 输出 z e r o zero; 如果 N < 0 N<0, 输出 n e g a t i v e negative。(150点数解答 | 2026-01-24 22:29:16)37
- [字节豆包] 题目描述 输入三个整数 x , y , z x,y,z, 如果 x x为奇数,输出 1 ∼ y 1∼y之间的所有数,如果 x x为偶数,输出 1 ∼ z 1∼z之间的所有数。 输入格式 输入包括一行,包含三个整数 x , y , z x,y,z,数字之间用空格隔开。 输出格式 输出包括一行 如果 x x为奇数,输出 1 ∼ y 1∼y之间的所有数,如果 x x为偶数,输出 1 ∼ z 1∼z之间的所有数,输出时,数与数之间用1个空格隔开。 input1 复制 1 10 5 output1 复制 1 2 3 4 5 6 7 8 9 10 input2 复制 4 20 4 output2 复制 1 2 3 4 样例解释 对于样例 1 1: x x是奇数, y = 10 y=10,因此输出 1 ∼ 10 1∼10。 对于样例 2 2: x x是偶数, z = 10 z=10,因此输出 1 ∼ 4 1∼4 。 c++ (391点数解答 | 2025-06-14 09:57:45)304
- [阿里通义] 最大整数 设有n个正整数(不超过int范围),将它们连接成一排组成一个最大的多位整数。 例如:n=3时,13、312、343三个整数连接成的最大整数为34 331 213。 又如:n=4时,7、13、4、246四个整数连接成的最大整数为7 424 613。 输入 第一行一个正整数n(n≤100); 第二行为n个正整数。 输出 输出一个正整数,表示连接成的最大正整数。 样例 输入复制 3 13 312 343 输出复制 34331213 语言方向:Java 系统环境:Windows(216点数解答 | 2025-11-28 15:42:47)24