剑指offer32

剑指offer32:把数组排成最小的数

题目描述

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

解法一:基于sort排序成最小字符串再拼接

/*
C++ sort() 实现,由于sort()的时间复杂度为O(nlogn),所以该时间复杂度也为O(nlogn)。
to_string() 可以将int 转化为string,int型不必再转换成string型便可以进行操作了。
要考虑到大数问题(即两个数前后连接之后,可能会溢出),解决方法:通过循环将numbers
数组里的元素赋值到新建的vector<string>容器里,再执行sort()!
*/
class Solution {
public:
    static bool Compare(string num1, string num2)
    {
        string strNum1 = num1;
        strNum1.append(num2);
        string strNum2 = num2;
        strNum2.append(num1);
        return strNum1<strNum2;
    }

    string PrintMinNumber(vector<int> numbers)
    {
        string result = "";
        //判定特殊情况
        if (numbers.size() == 0)
            return result;

        //将数字转换为字符存储
        vector<string> strNum;
        for (int i = 0; i<numbers.size(); i++)
            strNum.push_back(to_string(numbers[i]));

        //排序后strNum已经是最小的字符串了
        sort(strNum.begin(), strNum.end(), Compare);
        for (int i = 0; i<strNum.size(); i++)
            result.append(strNum[i]);
        return result;
    }
};

main函数

#include "stdafx.h"
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    vector<int> numbers = { 3,32,321 };
    Solution a;
    cout<<"最小的组合数字为: "<< a.PrintMinNumber(numbers)<<endl;

    system("pause");
    return 0;
}

   转载规则


《剑指offer32》 赵小亮 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
剑指offer31 剑指offer31
剑指offer31:整数中1出现的次数(从1到n整数中1出现的次数) 题目描述题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数? 为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因
2020-05-11
下一篇 
剑指offer27 剑指offer27
剑指offer27:字符串的排列 题目描述题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描
2020-05-09
  目录