[LintCode]379.将数组重新排序以构造最小值

给定一个整数数组,请将其重新排序,以构造最小值。

 注意事项

The result may be very large, so you need to return a string instead of an integer.

样例

给定 [3, 32, 321],通过将数组重新排序,可构造 6 个可能性数字:

3+32+321=332321
3+321+32=332132
32+3+321=323321
32+321+3=323213
321+3+32=321332
321+32+3=321323

其中,最小值为 321323,所以,将数组重新排序后,该数组变为 [321, 32, 3]


int转string的方式:

采用sstream中定义的字符串流对象来实现。字符串流对象的str函数对于istringstream和ostringstream都适用,都可以获取流中的内容。

ostringstream os; //构造一个输出字符串流,流内容为空 
int i = 12; 
os << i; //向输出字符串流中输出int整数i的内容 
cout << os.str() << endl; //利用字符串流的str函数获取流中的内容

sort 中的比较函数
当你需要按照某种特定方式进行排序时,你需要给sort指定比较函数,否则程序会自动提供给你一个比较函数。
vector < int > vect;
sort(vect.begin(), vect.end());
sort(vect.begin(), vect.end(), less<int>() );//此时相当于调用

需要注意的是,这些函数不是都能适用于你的sort算法,如何选择,决定于你的应用。另外,不能直接写入仿函数的名字,而是要写其重载的()函数:less<int>()
 

思路:把数字转换成字符串。由于数字m和n拼接起来得到mn和nm,他们的位数是相同的,因此比较大小只需要按照字符串大小的比较规则即可。

class Solution {
public:
    /**
     * @param nums n non-negative integer array
     * @return a string
     */
    string minNumber(vector<int>& nums) {
        string str;
        if(nums.size()<=0){
            return str;
        }
        //string数组每个字符对应nums每一个数字
        vector<string> strNumber(nums.size());
         //转化为字符串 
        for(int i=0;i<nums.size();i++){
            ostringstream os; //构造一个输出字符串流,流内容为空 
            os << nums[i]; //向输出字符串流中输出int整数i的内容 
            string s1 = os.str();//利用字符串流的str函数获取流中的内容
            strNumber[i]=s1;//把每个整数对应的字符赋到strNumber中
        } 
 
        //排序,输出结果;
        sort(strNumber.begin(),strNumber.end(),compare );
        for(int i=0;i<nums.size();i++)
        {
            str+=strNumber[i];
        } 
        
        //处理前面的0字母的情况 
        int count=0;//统计前面0字母个数
        for(int i=0;i<str.length();i++)
        {
            if(str[i]=='0'){
                count++;
            }else{
                break;
            }
        }
        //str全为0时,个数为count,返回“0”
        if(count==str.length()) return "0";
    //获得字符串str中 从第count位开始的长度为str.length()-count)的字符串 
        return str.substr(count,str.length()-count);//默认时的长度为从开始位置到尾
    }
    static bool compare(string a,string b)//必须加static
    {
        string str1=a+b;
        string str2=b+a;
        return (str1<str2);
    }
    
};



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值