1、題目描述
給定一組非負整數,重新排列它們的順序使之組成一個最大的整數。
2、示例
輸入: [3,30,34,5,9]
輸出: 9534330
3、題解
解法一:
基本思想:排序,將先將nums中數字轉爲字符串保存到ans,然後對ans排序,排序算法是將兩個字符串正反拼接後比較大小,這正好是題目所要求的返回最大拼接的字符串。
解法二:
基本思想:暴力,用二維數組vec保存nums中每個數字的每一位,然後進行排序比如3,31,34的順序是34,3,31,比較每一位數字如果vec[i][k]<vec[j][k]直接交換,如果vec[i][k]==vec[j][k],這個時候如果vec[i]到最後一位數字了,那就比較vec[j]當前位數字和vec[i]第一位數字的大小如果小於交換,如果vec[i][0]==vec[j][k+1]且k+1是vec[j]最後一位數字,對於830,8308和898,89的情況如果vec[i][temp]>vec[i][temp + 1]交換。
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
class Solution {
public:
string largestNumber(vector<int>& nums) {
//基本思想:排序,將先將nums中數字轉爲字符串保存到ans,然後對ans排序
//排序算法是將兩個字符串正反拼接後比較大小,這正好是題目所要求的返回最大拼接的字符串
string res;
vector<string> ans;
for (auto num : nums)
ans.push_back(to_string(num));
sort(ans.begin(), ans.end(), [](const string& a, const string& b) {return a + b > b + a; });
for (int i = 0; i < ans.size(); i++)
res.append(ans[i]);
if (res[0] == '0')
return "0";
return res;
}
};
class Solution1 {
public:
string largestNumber(vector<int>& nums) {
//基本思想:暴力,用二維數組vec保存nums中每個數字的每一位
//然後進行排序比如3,31,34的順序是34,3,31,比較每一位數字如果vec[i][k]<vec[j][k]直接交換
//如果vec[i][k]==vec[j][k],這個時候如果vec[i]到最後一位數字了,那就比較vec[j]當前位數字和vec[i]第一位數字的大小如果小於交換
//如果vec[i][0]==vec[j][k+1]且k+1是vec[j]最後一位數字,對於830,8308和898,89的情況如果vec[i][temp]>vec[i][temp + 1]交換
string res;
vector<vector<int>> vec;
for (auto num : nums)
{
vector<int> cur;
while (num / 10 != 0)
{
cur.push_back(num % 10);
num = num / 10;
}
cur.push_back(num);
reverse(cur.begin(), cur.end());
vec.push_back(cur);
}
for (int i = 0; i < vec.size() - 1; i++)
{
for (int j = i + 1; j < vec.size(); j++)
{
int k = 0;
while (k < vec[i].size() && k < vec[j].size())
{
if (vec[i][k] < vec[j][k])
{
swap(vec[i], vec[j]);
break;
}
else if (vec[i][k] > vec[j][k])
{
break;
}
else
{
if (k == vec[i].size() - 1 && k < vec[j].size() - 1)
{
while (k < vec[j].size() - 1)
{
if (vec[i][0] < vec[j][k + 1])
{
swap(vec[i], vec[j]);
break;
}
else if (vec[i][0] == vec[j][k + 1])
{
if (k + 1 == vec[j].size() - 1)
{
int temp = 0;
while (temp < vec[i].size() - 1)
{
if (vec[i][temp] > vec[i][temp + 1])
{
swap(vec[i], vec[j]);
break;
}
else if (vec[i][temp] < vec[i][temp + 1])
break;
else
temp++;
}
}
k++;
}
else
break;
}
break;
}
else if (k == vec[j].size() - 1 && k < vec[i].size() - 1)
{
while (k < vec[i].size() - 1)
{
if (vec[j][0] > vec[i][k + 1])
{
swap(vec[i], vec[j]);
break;
}
else if (vec[j][0] == vec[i][k + 1])
{
if (k + 1 == vec[i].size()-1)
{
int temp = 0;
while (temp < vec[j].size() - 1)
{
if (vec[j][temp] < vec[j][temp + 1])
{
swap(vec[i], vec[j]);
break;
}
else if (vec[j][temp] > vec[j][temp + 1])
break;
else
temp++;
}
}
k++;
}
else
break;
}
break;
}
}
k++;
}
}
}
for (int i = 0; i < vec.size(); i++)
{
for (int j = 0; j < vec[i].size(); j++)
res.push_back('0' + vec[i][j]);
}
if (res[0] == '0')
return "0";
else
return res;
}
};
int main()
{
Solution solute;
vector<int> nums = { 824,8248 };
cout << solute.largestNumber(nums) << endl;
return 0;
}