1.题目描述:

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

2.解题思路:

http://cuijiahua.com/blog/2018/01/basis_32.html
遇到这个题,全排列当然可以做,但是时间复杂度为O(n!)。在这里我们自己定义一个规则,对拼接后的字符串进行比较。

排序规则如下:

若ab > ba 则 a 大于 b,
若ab < ba 则 a 小于 b,
若ab = ba 则 a 等于 b;
根据上述规则,我们需要先将数字转换成字符串再进行比较,因为需要串起来进行比较。比较完之后,按顺序输出即可。

3.代码:

C++:

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:

# -*- coding:utf-8 -*-
class Solution:def PrintMinNumber(self, numbers):# write code hereif 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)

测试代码:

#include<iostream>
#include<algorithm>
using namespace std;//链接:https://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993
//来源:牛客网/*对vector容器内的数据进行排序,按照 将a和b转为string后若 a+b<b+a  a排在在前 的规则排序,如 2 21 因为 212 < 221 所以 排序后为 21 2 to_string() 可以将int 转化为string
*/class Solution
{public:static bool cmp(int a,int b){string A="";string B="";A+=to_string(a);A+=to_string(b);B+=to_string(b);B+=to_string(a);return A<B;}string PrintMinNumber(vector<int> numbers){string answer="";sort(numbers.begin(),numbers.end(), cmp);for(int i=0;i<numbers.size();i++){answer+=to_string(numbers[i]);}return answer;}
};int main()
{vector<int> vec={3,32,321};Solution t;string ans=t.PrintMinNumber(vec);cout<<ans<<endl;return 0;
}

《剑指offer》面试题——把数组排成最小的数相关推荐

  1. 剑指 Offer 笔记: T45. 把数组排成最小的数

    T45. 把数组排成最小的数 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 示例 1: 输入: [10,2] 输出: "102" ...

  2. 剑指offer面试题[29]-数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  3. 剑指offer面试题[40]-数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 注意原题目要求空间复杂度为0(1). 位运算的具体思路可以参看剑指offer. class So ...

  4. 剑指offer java -查找旋转数组的最小数字

    /** * Created by wqc on 2017/7/18. * 查找旋转数组的最小数字 * 把一个数组最开始的若干个元素搬到数组的末尾,称为数组的旋转 * 输入一个递增排序的数组的一个旋转, ...

  5. 剑指Offer - 面试题51. 数组中的逆序对(归并排序,求逆序对)

    1. 题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 示例 1: 输入: [7,5,6,4] 输出: 5限制: 0 ...

  6. 剑指Offer - 面试题3. 数组中重复的数字(哈希)

    1. 题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组 ...

  7. 剑指offer 面试题03. 数组中重复的数字

    找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...

  8. 剑指offer面试题[36]-数组中的逆序对

    题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...

  9. 剑指offer面试题[51]-数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  10. 剑指offer面试题39. 数组中出现次数超过一半的数字(数组)(摩尔投票法)

    题目描述 **数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素.** 思路 详见链接 代码 class Solution:def ...

最新文章

  1. java future 线程 状态_手把手带你了解Java线程的实现方式及生命周期原理
  2. Redis搭建(二):主从复制
  3. POJ2239简单二分匹配
  4. linux如何查tomcat是否安装,如何检测linux机器上是否安装了tomcat和ant
  5. Resin的安全性ip限制
  6. python爬虫cookie池 与ip绑定_Python爬虫:设置Cookie解决网站拦截并爬取蚂蚁短租
  7. 使用webpack打包ES6代码
  8. 数据库中间件01-认识mycat
  9. 计算机毕业论文指导过程记录表6,毕业论文指导记录表范文
  10. 大学计算机基础应用教程ppt,大学计算机基础教程.ppt
  11. Mac上修改hosts文件无效的解决方案
  12. 删除文件出现“文件正在使用或正在打开”
  13. 老男孩linux培训靠谱吗?到底该不该去?
  14. 如何测试服务器性能?
  15. windows 服务器多网卡设置路由
  16. org.hibernate.hql.internal.ast.QuerySyntaxException错误原因
  17. hive 正则表达式 过滤字符串里的中文
  18. 最大池化层mp:3*3_您所说的话:电池寿命最大化提示
  19. 批处理写的系统文件替换
  20. 商业银行把握机会,成就卓越绩效的建议

热门文章

  1. 非酋用计算机弹唱,非酋简谱 薛明媛/朱贺 听说爱情就是这样子
  2. php disable-ipv6,強迫 PHP Curl 使用 IPv4 , 忽略 IPv6
  3. day 03 剑指 Offer 10- I. 斐波那契数列-动态规划
  4. c语言链表排序交换节点,链表节点排序问题
  5. 服务中没有listen_Odoo 中的 IM(即时通讯)实现分析
  6. golang 连接多个mysql_Prometheus+Grafana监控MySQL
  7. HighCharts:设置饼图不可点击选择
  8. remmima 不能保存_不再使用RememBear密码管理器忘记密码
  9. 数值分析(7)-正交多项式
  10. 计算机视觉中,目前有哪些经典的目标跟踪算法?