leetcode 179. Largest Number 、剑指offer33 把数组排成最小的数

这两个题几乎是一样的,只是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来写的

posted @ 2017-07-25 11:36  有梦就要去实现他  阅读(413)  评论(0编辑  收藏  举报