编程题-最大数(中等)

题目:

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

相关推荐
小韩学长yyds22 分钟前
解锁STM32外设:开启嵌入式开发新世界
c++·stm32
KeithTsui33 分钟前
GCC RISCV 后端 -- GCC 构建系统简介
c语言·c++
#金毛1 小时前
C语言排序算法详解
c语言·算法·排序算法
笑鸿的学习笔记1 小时前
leetcode-442.数组中重复的数据
数据结构·算法·leetcode
醉城夜风~1 小时前
[数据结构]单值二叉树
数据结构·算法
刃神太酷啦1 小时前
C++(蓝桥杯常考点)
数据结构·c++·蓝桥杯c++组
星空露珠1 小时前
迷你世界脚本世界接口:World
数据结构·游戏·lua
星空露珠2 小时前
迷你世界脚本方块接口:Block
数据结构·游戏·lua
柃歌2 小时前
【UCB CS 61B SP24】Lecture 19 & 20: Hashing & Hashing II 学习笔记
java·数据结构·笔记·学习·算法
weixin_519311742 小时前
通过多线程分别获取高分辨率和低分辨率的H264码流
linux·运维·算法