一、前言
本系列文章为《剑指Offer》刷题笔记。
刷题平台:牛客网
书籍下载:共享资源
二、题目
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
1、思路
遇到这个题,全排列当然可以做,但是时间复杂度为O(n!)。在这里我们自己定义一个规则,对拼接后的字符串进行比较。
排序规则如下:
- 若ab > ba 则 a 大于 b,
- 若ab < ba 则 a 小于 b,
- 若ab = ba 则 a 等于 b;
根据上述规则,我们需要先将数字转换成字符串再进行比较,因为需要串起来进行比较。比较完之后,按顺序输出即可。
2、代码
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | class Solution { public: string PrintMinNumber(vector<int> numbers) { int length = numbers.size(); if(length == 0){ return ""; } sort(numbers.begin(), numbers.end(), cmp); string res; for(int i = 0; i < length; i++){ res += to_string(numbers[i]); } return res; } private: // 升序排序 static bool cmp(int a, int b){ string A = to_string(a) + to_string(b); string B = to_string(b) + to_string(a); return A < B; } }; |
Python:
1 2 3 4 5 6 7 8 9 | # -*- coding:utf-8 -*- class Solution: def PrintMinNumber(self, numbers): # write code here if len(numbers) == 0: return '' compare = lambda a, b:cmp(str(a) + str(b), str(b) + str(a)) min_string = sorted(numbers, cmp = compare) return ''.join(str(s) for s in min_string) |
注意在C++中,cmp函数要是使用static进行声明,声明是静态成员函数,这样才能正确调用。
微信公众号
分享技术,乐享生活:微信公众号搜索「JackCui-AI」关注一个在互联网摸爬滚打的潜行者。
2018年12月1日 上午10:55 沙发
大神,C++第8行,调用cmp是否少了参数
2018年12月1日 上午10:57 1层
@裸奔的麻瓜 没有,看下sort的用法你就知道了。
2018年12月1日 上午11:41 板凳
谢谢指点,另外问一下,python第7 行cmp好像没有定义呢?
2018年12月1日 下午12:22 1层
@裸奔的麻瓜 这是python内置函数。
2019年8月29日 下午9:25 地板
大哥 为啥要加static