面试题33_把数组排成最小的数

本文介绍了一种算法,该算法接收一个正整数数组,通过自定义排序规则将数组中的数字转换为字符串并拼接起来,以形成可能的最大整数。文章详细解释了解决方案的思路,并提供了一个具体的C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。


解题思路

这道题是一个排序问题,但是要自定义排序规则。

需要注意的问题是:拼接起来的数可能超出整型数的表示范围,因此这也是一个大数问题。

用字符串来表示解决溢出问题。


实现代码

<span style="font-size:18px;">
class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        
        string ret;
        ret.clear();
        if(numbers.empty())
            return ret;
        
        string numToStr;
        int len = numbers.size();
        vector<string> vStr;
        
        for(int i=0; i< len ;i++)
        {
        	stringstream sst;//定义string流对象
            sst<<numbers[i];//这里注意 流写入符号 "<<" 也就是标准输出符号,在这里是用来向
			//流对象写入数据

        	vStr.push_back(sst.str());    
        }
        
        sort(vStr.begin(), vStr.end(),compare);
        
        for(int i=0; i<len; i++)
            ret.append(vStr[i]);
        
        return ret;
    }
    
    static bool compare(const string &str1, const string &str2)
    {
    	return (str1+str2) < (str2+str1);//注意小于号,代表从小到大排序,大于号则相反    
    }
      
};

</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值