题解 | #最大数#
最大数
http://www.nowcoder.com/practice/fc897457408f4bbe9d3f87588f497729
考的是排序算法,使用任何一种排序算法都可以过,我使用的是快排。题目的增加一点难点,就是把比较大小的函数自定义一下,变成比较拼接后的大小。
比如 123,567 分别拼接成左边在前的123567,右边在前的567123,比较后面两个拼接的数字的大小。按这个来排序。
class Solution {
public:
/**
* 最大数
* @param nums int整型vector
* @return string字符串
*/
string solve(vector<int>& nums) {
// write code here
nums = quikSort(nums);
if(nums[0] == 0){
return "0";
}
return numsToString(nums);
}
//比较排列先后
bool comSolve(int a,int b){
int left = a;
int right = b;
if(a >= 1000){
right = b * 10000 + a;
}else if(a >= 100){
right = b * 1000 + a;
}else if(a >= 10){
right = b * 100 + a;
}else{
right = b * 10 + a;
}
if(b >= 1000){
left = a * 10000 + b;
}else if(b >= 100){
left = a * 1000 + b;
}else if(b >= 10){
left = a * 100 + b;
}else{
left = a * 10 + b;
}
return left >= right;
}
//排序
vector<int> quikSort(vector<int> & nums){
if(nums.size() <= 1){
return nums;
}
vector<int> left;
vector<int> right;
for(int i=1;i<nums.size();i++){
if(comSolve(nums[i],nums[0])){
left.push_back(nums[i]);
}else{
right.push_back(nums[i]);
}
}
left = quikSort(left);
right = quikSort(right);
left.push_back(nums[0]);
left.insert(left.end(),right.begin(),right.end());
return left;
}
//转字符串
string numsToString(vector<int> & nums){
string res = "";
for(int i=0;i<nums.size();i++){
res += to_string(nums[i]);
}
return res;
}
}; 简化一下比较函数,然后快排也可以优化一下 class Solution {
public:
/**
* 最大数
* @param nums int整型vector
* @return string字符串
*/
string solve(vector<int>& nums) {
// write code here
quikSort(nums,0,nums.size()-1);
if(nums[0] == 0){
return "0";
}
return numsToString(nums);
}
//比较排列先后
bool comSolve(int a,int b){
return to_string(a)+to_string(b) <= to_string(b)+to_string(a);
}
//排序
void quikSort(vector<int> & nums,int left,int right){
if(left >= right){
return;
}
int i=left,j = right;
int base = nums[left];
while(i<j){
while(comSolve(nums[j],base) && i < j) {
j--;
};
while(comSolve(base,nums[i]) && i < j) {
i++;
};;
if(i<j){
swap(nums[i], nums[j]);
}
}
nums[left] = nums[i];
nums[i] = base;
quikSort(nums, left, i-1);
quikSort(nums, i+1, right);
}
//转字符串
string numsToString(vector<int> & nums){
string res = "";
for(int i=0;i<nums.size();i++){
res += to_string(nums[i]);
}
return res;
}
};

查看6道真题和解析