这两个题几乎是一样的,只是leetcode的题是排成最大的数,剑指的题是排成最小的
179. Largest Number
a.需要将数组的数转换成字符串,然后再根据大小排序,这里使用to_string函数将整数转换成字符串,比printf的方式简洁
b.cmp函数必须用static才能使用
c.这题需要排成最大的数,cmp函数如何确定< 、>符合呢?cmp中可以默认为a就是两个字符中的第一个,b是第二个,所以a+b>b+a返回true就继续保持这样的排列。如果是<,a+b就会返回fasle,相对于原来的情况就要重新排列
d.会出现这种情况:
Input:
[0,0]
Output:
"00"
Expected
即拼接成了多个0,这个时候通过判断第一个字符是不是0来确定返回值
class Solution { public: string largestNumber(vector<int>& nums) { vector<string> input; for(int i = 0;i < nums.size();i++) input.push_back(to_string(nums[i])); sort(input.begin(),input.end(),cmp); string res = ""; for(int i = 0;i < input.size();i++) res += input[i]; return res[0] == '0' ? "0" : res; } static bool cmp(string a,string b){ return a + b > b + a; } };
剑指offer33 把数组排成最小的数
正确代码
class Solution { public: string PrintMinNumber(vector<int> numbers) { vector<string> str; for(int i = 0;i < numbers.size();i++){ char ch[999]; sprintf(ch,"%d",numbers[i]); str.push_back(ch); } sort(str.begin(),str.end(),cmp); string s; for(int i = 0;i < str.size();i++) s += str[i]; return s; } static bool cmp(string a,string b){ return a+b < b+a; } };
如果写成这样,是错误的。因为tmp是个char,因为str这个vector是string的。
char tmp = numbers[i] + '0'; str.push_back(tmp);
如果写成这样,也是错误的。因为+'0'这种转换只能转换成char字符,不能转换成字符串。
string tmp = numbers[i] + '0'; str.push_back(tmp);
利用to_string函数可写
string tmp = to_string(numbers[i]); str.push_back(tmp);
其他人也有用stringstream来写的