数据结构&算法&人工智能

剑指offer编程题—把数组排成最小的数

2020-04-07  本文已影响0人  零岁的我

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

解题思路
先将vector容器内的元素从小到大进行排序(需要定制排序规则),然后将排好序的元素依次拼接,得到最终答案。
对于两个整数a,b的排序规则如下:
先将a,b转换为字符数字,然后按照不同的顺序拼接,用拼接字符的大小关系表示两个整数的大小关系。

  1. 若ab>ba,则a>b;
  2. 若ab<ba,则a<b;
  3. 若ab=ba,则a=b.
    举例:3<32,但是拼接后的字符323<332,所以32<3.排序时32 在3前面。
class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        string res;
        int len=numbers.size();
        if(len<1) return res;
        sort(numbers.begin(),numbers.end(),cmp);
        for(int i=0;i<len;++i){
            res+=to_string(numbers[i]);
        }
        return res;
    }
    static bool cmp(int a,int b){
        string x=to_string(a)+to_string(b);
        string y=to_string(b)+to_string(a);
        return x<y;
    }
};

注意:上述代码中的比较函数必须定义成静态成员函数,否则编译器会报错。
原因是C++中函数模板sort()中的第三个参数是一个指针函数,包含两个形参,但是类的非静态函数还包含一个隐形参数(this指针),可能就是这个原因编译器才会报错吧,这也是个人揣摩,如有误请指正。

当然,如果比较函数不定义为静态函数,也可以将比较函数定义为全局函数,在类内直接调用,如下所示:

bool cmp(int a,int b) 
{
     string x=to_string(a)+to_string(b);
     string y=to_string(b)+to_string(a);
     return (x<y);
}
class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        string res;
        int len=numbers.size();
        if(len<1) return res;
        sort(numbers.begin(),numbers.end(),cmp);
        for(int i=0;i<len;++i){
            res+=to_string(numbers[i]);
        }
        return res;
    }
};
上一篇下一篇

猜你喜欢

热点阅读