给定一个整数数组,请将其重新排序,以构造最小值。
注意事项
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);
}
};