编程题-最大数(中等)

题目:

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

相关推荐
啊我不会诶3 分钟前
CF每日4题
算法
uhakadotcom19 分钟前
人工智能如何改变医疗行业:简单易懂的基础介绍与实用案例
算法·面试·github
吴_知遇1 小时前
【华为OD机试真题】428、连续字母长度 | 机试真题+思路参考+代码解析(E卷)(C++)
开发语言·c++·华为od
LaoWaiHang1 小时前
MFC案例:使用键盘按键放大、缩小窗口图像的实验
c++·mfc
山北雨夜漫步1 小时前
机器学习 Day14 XGboost(极端梯度提升树)算法
人工智能·算法·机器学习
到底怎么取名字不会重复2 小时前
Day10——LeetCode15&560
c++·算法·leetcode·哈希算法·散列表
chuxinweihui2 小时前
数据结构——二叉树,堆
c语言·开发语言·数据结构·学习·算法·链表
freexyn2 小时前
Matlab自学笔记五十一:(推荐)输入参数的数量和可变数量的输入
笔记·算法·matlab
陈大大陈2 小时前
基于 C++ 的用户认证系统开发:从注册登录到Redis 缓存优化
java·linux·开发语言·数据结构·c++·算法·缓存
纪元A梦2 小时前
华为OD机试真题——通过软盘拷贝文件(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
java·javascript·c++·python·华为od·go·华为od机试题