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

题目:

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

思路:

方法一:先求出所有排列,然后找最小值,复杂度高

方法二:定义比较函数,对于两个数,m和n,如果按mn拼接的数比按nm拼接得到的数小,则定义m<n。按照这种自定义的比较函数将数组排序,然后再顺序将数组中的数拼接起来,即得到拼起来的最小数字。

有几点注意的:

1. 可以将数字转化为字符串处理,拼接的操作只需要相加即可。比较的时候因为mn和nm的长度一致,所以可以直接按字符串比较规则来比较对应的数字大小。

2. 整型转字符串用to_string();字符串转整形用stoi()。

3. 自定义vector排序函数的比较函数时,要定义为static。

参考代码:

在线测试

https://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993?tpId=13&tqId=11185&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

AC代码

class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        string result;
	    if(numbers.empty())
		    return result;
	    sort(numbers.begin(),numbers.end(),compare);
        for(int i=0;i<numbers.size();i++)
	    {
		    result+=to_string(numbers[i]);
	    }
        return result;
    }

    static bool compare(int m,int n){
        string ms=to_string(m);
        string ns=to_string(n);
	    return ms+ns<ns+ms;
    }
};

猜你喜欢

转载自blog.csdn.net/u012991043/article/details/81390473
今日推荐