题目:
给定一组非负整数 nums
,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
**注意:**输出结果可能非常大,所以你需要返回一个字符串而不是整数。

解法一(排序-位数对齐):
将不同位数大小的数组均转换成最大位数进行对齐(以自身位数作为循环直至达到最大位数),随后对对齐的所有数进行从小到大的排序,然后从数值越大的数进行添加,依次添加到最小的数结束为止,其中记录再转换成最大位数时,增加新位数的数量,在添加时需要对新增位数进行剔除。并增加例如"0"的特殊情况,防止"00"不符合正确输出要求的约束,如下为笔者代码:
cpp
class Solution {
public:
string largestNumber(vector<int>& nums) {
string result = "";
int length = nums.size();
int max = 12;
// vector<vector<double>>用于记录位数对齐后的数组,
//以及每个数组在位数对齐过程中增加的位数数量
vector<vector<double>> nums_all;
for(int i=0; i<length;i++){
string str = std::to_string(nums[i]);
int a = str.size();
vector<double> nums_only;
double cc = nums[i]*pow(10,max-a);
int index=0;
int kyk = max-a;
for(int j=0;j<max-a;j++){
if(index==a){
index=0;
}
cc = cc+(str[index]-'0')*pow(10,kyk-1);
kyk--;
index++;
}
nums_only.push_back(cc);
nums_only.push_back(max-a);
nums_all.push_back(nums_only);
}
//对位数对齐后的nums_all数组重新排序sort()
sort(nums_all.begin(),nums_all.end());
for(int i=length-1;i>=0;i--){
int a = max-nums_all[i][1];
for(int j=0; j<a;j++){
//对"0"不满足数字基本条件要求的情况进行约束"00"不是数字的正确格式
if(result!="0"){
string str = std::to_string(nums_all[i][0]);
result = result + str[j];
}
}
}
return result;
}
};
解法二(排序-两元素相对位置排序):
我们通过比较两个元素就可以确定它们在排序以后的相对位置关系,每次新增加的数,只需要与之前每个独立的数进行比较排列关系即可,即如果aΘb且bΘc,那么一定有aΘc这个条件(即排列顺序ac>ca),其中Θ为满足要求的最大数排序规则,根据这个规则只需要当新增加的数出现时,与原有排序好的独立数进行比较,确定固定位置即可完成最大数求解,如下为实现代码:
cpp
class Solution {
public:
string largestNumber(vector<int> &nums) {
sort(nums.begin(), nums.end(), [](const int &x, const int &y) {
return to_string(x) + to_string(y) > to_string(y) + to_string(x);
});
if (nums[0] == 0) {
return "0";
}
string ret;
for (int &x : nums) {
ret += to_string(x);
}
return ret;
}
};
笔者小记:
1、字符串比较,在C++中,std::string
类型的字符串可以通过直接使用比较运算符进行大小比较。比较是基于字典顺序(即按字符的 ASCII 或 Unicode 值逐一比较)进行的:
字符串比较是逐字符进行的,直到找到不同字符为止,如果字符串前缀相同,较短的字符串会被认为小于较长的字符串。如果字符串长度相同,则会有以下情况:
str1 < str2
:检查 str1
是否字典顺序小于 str2。例如"3190" < "3192"。
str1 > str2
:检查 str1
是否字典顺序大于 str2。例如"5342" > "5340"。
<str1 == str2
:检查 str1
是否等于 str2。例如 "7365" == "7365"。
2、关于sort()排序函数的高阶使用,以下面代码为例:
cpp
sort(nums.begin(), nums.end(), [](const int &x, const int &y) {
return to_string(x) + to_string(y) > to_string(y) + to_string(x);
});
在sort()函数中,1、nums.begin()和nums.end():表示数组nums的起始和结束迭代器,用于指定排序的范围;2、Lambda函数:[](const int &x, const int &y){}是一个匿名函数(lambda表达式),它接受两个整数x和y作为参数,并返回它们按特定规则排序的结果。3、to_string(x) + to_string(y) > to_string(y) + to_string(x),比较的是x和y组合后的字符串,而不是数字大小本身。如果to_string(x) + to_string(y)大于to_string(y) + to_string(x),则返回true,表示x应该排在y前面。