把数组排成最小的数
Posted xiaokang01
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了把数组排成最小的数相关的知识,希望对你有一定的参考价值。
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
题解:
这里涉及到了整数转换字符串问题
我们可以先将数组转换成字符串,存放在一个字符串容器中vector<string>
然后对这个容器进行自定义规则排序
a+b < b+a 就把a放在b前面
就是说: 2 21 因为 212 < 221 所以a要放在b前面
然后进行字符串拼接
1 #include <iostream> 2 #include <vector> 3 #include <string> 4 #include <algorithm> 5 6 using namespace std; 7 8 class Solution { 9 public: 10 11 static bool cmmp(string a, string b) 12 { 13 return (a+b) < (b+a); // 按照从小到大排序 14 } 15 string PrintMinNumber(vector<int> numbers) 16 { 17 int len = numbers.size(); 18 if (len <= 0) 19 return ""; 20 vector<string> str; 21 for(int i = 0; i< len; i++) 22 { 23 // 将数组中的数转换成字符串,保存到字符串数组中 24 str.push_back(to_string(numbers[i])); 25 } 26 //排序 27 sort(str.begin(), str.end(), cmmp); 28 string res; 29 for(int i = 0; i< len; i++) 30 { 31 res += str[i]; 32 } 33 cout << res; 34 return res; 35 } 36 }; 37 int main() 38 { 39 Solution s; 40 41 vector <int> vec = {3,32,321}; 42 string res = s.PrintMinNumber(vec); 43 cout << res << endl; 44 return 0; 45 }
也可以不用辅助数组,直接按照上面的规则进行排序,思路一样
#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; /* * 对vector内的数据进行排序,按照 这种规则: * 将a和b准换成字符串之后to_string * 如果 a+b < b+a 就把a放在b前面 * 如 2 21 因为212 < 221 所以排序后是 21 2 * to_string 可以将int转换成string类型 */ class Solution { public: static bool cmp(int a, int b) { string s1 = to_string(a) + to_string(b); string s2 = to_string(b) + to_string(a); return s1 < s2; // s1<s2 就把s1放在前面 } string PrintMinNumber(vector<int> numbers) { int len = numbers.size(); if(len <= 0) return ""; sort(numbers.begin(), numbers.end(), cmp); string res; for(int i = 0; i < len; i++) { res += to_string(numbers[i]); } return res; } }; int main() { Solution s; vector <int> vec = {3,32,321}; string res = s.PrintMinNumber(vec); cout << res << endl; return 0; }
以上是关于把数组排成最小的数的主要内容,如果未能解决你的问题,请参考以下文章
剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数