编程题-最大数(中等)

题目:

给定一组非负整数 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前面。

相关推荐
算AI14 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
我不会编程55515 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
懒羊羊大王&15 小时前
模版进阶(沉淀中)
c++
owde16 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
第404块砖头16 小时前
分享宝藏之List转Markdown
数据结构·list
GalaxyPokemon16 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
W_chuanqi16 小时前
安装 Microsoft Visual C++ Build Tools
开发语言·c++·microsoft
hyshhhh16 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
蒙奇D索大16 小时前
【数据结构】第六章启航:图论入门——从零掌握有向图、无向图与简单图
c语言·数据结构·考研·改行学it
A旧城以西17 小时前
数据结构(JAVA)单向,双向链表
java·开发语言·数据结构·学习·链表·intellij-idea·idea