编程题-最大数(中等)

题目:

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

相关推荐
蒸蒸yyyyzwd2 分钟前
机试和Redis学习笔记
c++·笔记·面试
tdtsmt1 小时前
2026年SMT贴片加工选型指南:天地通电子推荐参考
c++
果壳science1 小时前
《自然本源》如何实现狭义相对论的代数化
笔记·算法·几何学
一木 之林1 小时前
插件、MCP、Skill 的区别?
java·c++·人工智能
suhan1 小时前
【数据结构】二、线性表:2.单链表的定义与实现(带头结点与不带头结点的区别)
数据结构
ShineWinsu2 小时前
对于MySQL:内置函数的解析
linux·数据库·c++·mysql·面试·函数·查询
302wanger2 小时前
分享一个工作习惯:整点看即时消息
算法
洋不写bug3 小时前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
牧羊人.3333 小时前
动手学深度学习 03 | 卷积神经网络实现手写数字识别
人工智能·深度学习·神经网络·算法·cnn
AgentMaster4 小时前
数据治理工具选型指南:一套可复用的四阶段决策框架
大数据·数据结构·人工智能·算法