Largest Number

本文介绍了一种算法,用于将非负整数列表重新排列形成最大的可能数值。通过比较字符串的不同组合来确定最佳顺序,并讨论了实现过程中的关键挑战。

Given a list of non negative integers, arrange them such that they form the largest number.

For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

Note: The result may be very large, so you need to return a string instead of an integer.

一开始脑子没转过弯来,用的复杂的判断大小方法,一直通不过各种 test case

class Solution {
public:
    void execute(string &str, vector<string> &strnum)
    {
        while(strnum.begin() != strnum.end())
        {
            vector<string>::iterator big = strnum.begin();
            vector<string>::iterator iter = big+1;
            while (iter != strnum.end())
            {
                if (big->compare(*iter) == 0)
                 {
                     iter++;
                     continue;
                 }
                int i = 0;
                while(1)
                {
                    if (i == big->size())
                     {
                         if (big->compare(iter->substr(i)) < 0)
                             big = iter;
                        break;
                     }
                    if (i == iter->size())
                    {
                       if (iter->compare(big->substr(i)) > 0)
                            big = iter;
                        break;
                    }
                    if ((*big)[i] > (*iter)[i])
                        break;
                    if ((*big)[i] < (*iter)[i])
                    {
                        big = iter;
                        break;
                    }
                    i++;
                }
                iter++;
            }
            str += *big;
            strnum.erase(big);
        }
    }
    string largestNumber(vector<int> &num) 
    {
        string res;
        vector< vector<string> > strnum(10);
        for (int i = 0; i < num.size(); i++)    
         {
             stringstream ss;
             ss << num[i];
             string tmp = ss.str();
             strnum[tmp[0] - '0'].push_back(tmp);
         }
        
         for (int i = 9; i > 0; i--)
           execute(res, strnum[i]);
         if (res.empty())
            return "0";
        execute(res, strnum[0]);
         return res;
    }
};

后来不知怎么脑袋就开窍了就通过了,难点就在于判断俩首字母相同的字符串大小吧

class Solution {
public:
    void execute(string &str, vector<string> &strnum)
    {
        while(strnum.begin() != strnum.end())
        {
            vector<string>::iterator big = strnum.begin();
            vector<string>::iterator iter = big+1;
            while (iter != strnum.end())
            {
                string tmp1 = *big;
                tmp1 += *iter;
                string tmp2 = *iter;
                tmp2 += *big;
                if (tmp1.compare(tmp2) < 0)
                   big = iter;
                 iter++;
            }
            str += *big;
            strnum.erase(big);
        }
    }
    string largestNumber(vector<int> &num) 
    {
        string res;
        vector< vector<string> > strnum(10);
        for (int i = 0; i < num.size(); i++)    
         {
             stringstream ss;
             ss << num[i];
             string tmp = ss.str();
             strnum[tmp[0] - '0'].push_back(tmp);
         }
        
         for (int i = 9; i > 0; i--)
           execute(res, strnum[i]);
           
         if (res.empty())
            return "0";
            
         if(strnum[0].size() > 0)
         {
             string tmp(strnum[0].size(), '0');
             res += tmp;
         }
        return res;
    }
};



# 题目重述 输入三个数 $a, b, c$,输出其中最大值,但结果出现异常值 $-858993460$,为何会出现这种情况? # 详解 该现象通常出现在 **C/C++ 编写的程序中**,尤其是未正确初始化变量或未正确读取输入的情况下。错误输出 $-858993460$ 是一个典型的**未初始化内存的默认值**(常见于 Visual Studio 调试环境,十六进制为 `0xCCCCCCCC`,表示未初始化栈内存)。 可能的错误代码示例如下(C语言): ```c #include <stdio.h> int main() { int a, b, c, max; printf("please input a,b,c\n"); scanf("%d %d %d", &a, &b, &c); if (a > b && a > c) max = a; else if (b > a && b > c) max = b; else if (c > a && c > b) max = c; printf("the largest number is %d\n", max); // 此处 max 可能未被赋值 return 0; } ``` **问题出在逻辑不完整**:当两个数相等且大于第三个数时(如 $a = b > c$),前两个条件不成立,而第三个条件 `c > a && c > b` 也不成立,导致 `max` 未被赋值,使用了未定义值。 更严重的是:若 $a = b = c$,则所有判断都失败,`max` 完全未赋值,导致打印**随机内存值**,即出现类似 $-858993460$ 的结果。 ### 正确做法: 应确保所有情况都被覆盖,推荐使用 `else` 覆盖最后情形: ```c if (a >= b && a >= c) max = a; else if (b >= a && b >= c) max = b; else max = c; ``` 或使用嵌套比较避免遗漏。 # 知识点(列出解答该问题需要的知识点) - **变量初始化**:未初始化局部变量会包含不确定值,导致不可预测行为。 - **条件语句完整性**:分支逻辑必须覆盖所有可能情况,防止漏判。 - **输入输出匹配**:确保 `scanf` 成功读取数据,否则变量保持未定义状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值