1. 剑指Offer - 九度1504 - 把数组排成最小的数
    2014-02-06 00:19
题目描述:

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

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。
输入的第二行包括m个正整数,其中每个正整数不超过10000000。

输出:

对应每个测试案例,
输出m个数字能排成的最小数字。

样例输入:
  1. 3
  2. 23 13 6
  3. 2
  4. 23456 56
样例输出:
  1. 13236
  2. 2345656
  1. 题意分析:
      将一组数字从左到右连起来,使得组成的一个大数最小。
      我首先想到的方法,当然是写一个自定义的比较函数,然后使用qsort或者sort来将数组排好序,连接起来即可。
      问题是:这个比较函数怎么写呢?
      我的第一次尝试,是将两个数字逐位进行比较,但有一种问题:1231231123012312123123,这些数字谁该放前面呢?
      不难看出来,上面的情况就是存在前缀的情况。我尝试写了一版代码,自测通过但是提交后Wrong Answer
      想了几分钟还是没想出问题,于是觉得应该更简单粗暴点。对于两个数字xy,直接看看谁放前面的结果比较小,就把谁放前面。
      比较函数非常简单,请参见代码。为了方便起见,直接用string来表示数字。
      时间复杂度O(n * log(n)),源于sort的调用,空间复杂度O(1)。
  1. // 689366 zhuli19901106 1504 Accepted 点击此处查看所有case的执行结果 1524KB 771B 270MS
  2. //
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <string>
  6. #include <vector>
  7. using namespace std;
  8.  
  9. vector<string> vv;
  10. int n;
  11.  
  12. bool comparator(const string &x, const string &y)
  13. {
  14. string s1, s2;
  15.  
  16. s1 = x + y;
  17. s2 = y + x;
  18. return s1 < s2;
  19. }
  20.  
  21. int main()
  22. {
  23. string s;
  24. int i;
  25.  
  26. while (cin >> n) {
  27. vv.clear();
  28. for (i = ; i < n; ++i) {
  29. cin >> s;
  30. vv.push_back(s);
  31. }
  32. sort(vv.begin(), vv.end(), comparator);
  33. s = "";
  34. for (i = ; i < n; ++i) {
  35. s = s + vv[i];
  36. }
  37. for (i = ; i < (int)s.length() - ; ++i) {
  38. if (s[i] != '') {
  39. break;
  40. }
  41. }
  42. s = s.substr(i, s.length() - i);
  43. cout << s << endl;
  44. }
  45.  
  46. return ;
  47. }

剑指Offer - 九度1504 - 把数组排成最小的数的更多相关文章

  1. 剑指Offer - 九度1386 - 旋转数组的最小数字

    剑指Offer - 九度1386 - 旋转数组的最小数字2013-11-24 01:57 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转 ...

  2. 剑指Offer:面试题33——把数组排成最小的数(java实现)(未完待续)

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

  3. 剑指offer(32)把数组排成最小的数

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

  4. 【剑指Offer】32、把数组排成最小的数

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

  5. 剑指Offer - 九度1516 - 调整数组顺序使奇数位于偶数前面

    剑指Offer - 九度1516 - 调整数组顺序使奇数位于偶数前面2013-11-30 02:17 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部 ...

  6. 剑指Offer - 九度1348 - 数组中的逆序对

    剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...

  7. 剑指Offer - 九度1384 - 二维数组中的查找

    剑指Offer - 九度1384 - 二维数组中的查找2013-11-23 23:23 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...

  8. 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字

    剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...

  9. 剑指Offer - 九度1351 - 数组中只出现一次的数字

    剑指Offer - 九度1351 - 数组中只出现一次的数字2013-11-23 01:23 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. ...

随机推荐

  1. 在android开发中如何使用JavaMail程序

    javaMail,是提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.我们可以基于JavaMail开发出类似于Microsoft  ...

  2. vue checkbox 双向绑定及初始化渲染

    双向绑定可以绑定到同一个数组 <input type="checkbox" id="jack" value="Jack" v-mode ...

  3. Java连接mysql中遇到的一些问题及解决方法

    1.Java使用mysql-jdbc连接MySQL出现如下警告: Establishing SSL connection without server's identityverification i ...

  4. Spring任务执行器(TaskExecutor)

    Spring任务执行器(TaskExecutor)    Spring通州任务执行器(TaskExecutor)来实现多线程和并发编程,使用ThreadPoolTaskExecutor可实现一个基于线 ...

  5. 简单使用mybatis(idea中使用)

    首先创建一个maven项目 第一步:在pom.xml中添加依赖 <dependencies> <!--mybatis--> <dependency> <gro ...

  6. EBS R12中FND凭证打印警告:OPP响应超时

    接近年关,最近年结忙的飞起,此为背景,今天运维那边反应日记账凭证打印报错,看了下后台请求发现请求有警告. 查看日志发现报了“并发:OPP响应超时”的警告,这个地方响应超时可能是配置文件中“并发:OPP ...

  7. git和svn的混用

    服务器上的项目是使用svn进行管理的. 本来本地的项目也是通过svn进行管理的,但是后来使用svn的分支功能进行项目的测试/新功能等等时,总是会出现各种各样的问题,遂转投git. 因为git的分支机制 ...

  8. 微信小程序清除默认样式

    1.清除button的默认样式 button::after{border:none;}input{outline:none;border:none;list-style: none;}

  9. JQuery实现层级菜单

    效果图: HTML代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  10. turtle画玫瑰花

    import turtle turtle.screensize(400, 300, "pink") turtle.setup(1000, 600) turtle.write('作者 ...