剑指OFFER之把数组排成最小的数(九度OJ1504)
2019独角兽企业重金招聘Python工程师标准>>>
题目描述:
-
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
- 输入:
-
输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数。
输入的第二行包括m个正整数,其中每个正整数不超过10000000。
- 输出:
-
对应每个测试案例,
输出m个数字能排成的最小数字。
- 样例输入:
3
23 13 6
2
23456 56
- 样例输出:
13236
2345656
解题思路:
首先,最普通的思路就是权进行一次排列,找出最小的数。但是这样可能会超时。
这里,我们首先对数列进行排序,最后进行一次整合。算法上面主要采取冒泡排序,对每个数与其前面的数进行比较。
void bubbleSort(char c[][10],int n){int i,j;for( i=n-1 ; i>0 ; i-- ){for(j = n-1;j>(n-1-i);j--){if(findSmall(c,j))swap(c,j,j-1);}}
}
在比较时,采用特别的思路----把两个字符串进行拼接,如果字符串1排在前面的数小,那么就把字符串1放到前面。
int findSmall(char c[][10],int i){char stri[20];char strj[20];strcpy(stri,c[i]);strcpy(strj,c[i-1]);strcat(stri,c[i-1]);strcat(strj,c[i]);int k;int length = strlen(stri); for(k=0;k<length;k++){if(stri[k] == strj[k])continue;else if(stri[k] < strj[k]){return 1;}else{return 0;}}
}
排序后,可以保证直接进行连接的数列是最小的。
全部代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void bubbleSort(char c[][10],int n);
int findSmall(char c[][10],int i);
void swap(char c[][10],int i,int j);
int main(){int n,i;while(scanf("%d",&n)!=EOF && n>0 && n<=100 ){int arr[100];char c[100][10];char string[1000];for(i=0;i<n;i++){scanf("%d",&arr[i]);sprintf(c[i],"%d",arr[i]);}bubbleSort(c,n);strcpy(string,c[0]);for(i=1;i<n;i++){strcat(string,c[i]);}printf("%s\n",string);}return 0;
}
void bubbleSort(char c[][10],int n){int i,j;for( i=n-1 ; i>0 ; i-- ){for(j = n-1;j>(n-1-i);j--){if(findSmall(c,j))swap(c,j,j-1);}}
}
int findSmall(char c[][10],int i){char stri[20];char strj[20];strcpy(stri,c[i]);strcpy(strj,c[i-1]);strcat(stri,c[i-1]);strcat(strj,c[i]);int k;int length = strlen(stri); for(k=0;k<length;k++){if(stri[k] == strj[k])continue;else if(stri[k] < strj[k]){return 1;}else{return 0;}}
}
void swap(char c[][10],int i,int j){char tmp[10];int k;for(k=0;k<10;k++){tmp[k] = c[i][k];c[i][k] = c[j][k];c[j][k] = tmp[k];}
}
/**************************************************************Problem: 1504User: xhaloLanguage: CResult: AcceptedTime:320 msMemory:916 kb
****************************************************************/
转载于:https://my.oschina.net/u/204616/blog/545011
剑指OFFER之把数组排成最小的数(九度OJ1504)相关推荐
- 【LeetCode】剑指 Offer 45. 把数组排成最小的数
[LeetCode]剑指 Offer 45. 把数组排成最小的数 文章目录 [LeetCode]剑指 Offer 45. 把数组排成最小的数 package offer;import java.uti ...
- 《剑指offer》-- 把数组排成最小的数、丑数、二进制中1的个数、表示数值的字符串、替换空格
一.把数组排成最小的数: 1.题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为 ...
- 剑指offer:把数组排成最小的数
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 解题思路 依 ...
- 【自定义排序规则】剑指 Offer 45. 把数组排成最小的数
我是小张同学,立志用更简洁的代码做更高效的表达 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 示例 1: 输入: [10,2] 输出: "1 ...
- 《剑指offer》把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 解析方式一:非常 ...
- 【算法】剑指 Offer 45. 把数组排成最小的数 【重刷】
1.概述 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 示例 1: 输入: [10,2] 输出: "102" 示例 2: 输入: ...
- 剑指Offer之把数组排成最小的数
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 解题思路 把 ...
- 【LeetCode笔记】剑指 Offer 45. 把数组排成最小的数(Java、字符串、Lambda)
文章目录 题目描述 思路 && 代码 二刷 题目描述 很 nice 的一道题!花的时间也不会很多,还能复习复习 Lambda- 思路 && 代码 核心思路:如果 x + ...
- 力扣—剑指 Offer 45. 把数组排成最小的数
题目 解决方法 参看官方解决思路,就是将数列中的元素两两拼接.如'2'+'3'='23'<'3'+'2'='32'则2在3的左边.由于该题不用考虑组合后第一位是零的情况,所以这样将所有的元素比较 ...
最新文章
- mybatis oracle批量修改
- T-SQL基础(三)之子查询与表表达式
- MySQL【问题记录 01】报错 1709 - Index column size too large. The maximum column size is 767 bytes. 可能是最简单的方法
- android 图片变颜色代码,Android -对图片Drawable进行变色
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU特性介绍(3)- 命名规则
- 白话经典算法系列之——希尔排序的实现
- word无法验证服务器,windows10系统下office2010无法验证的解决方法
- android Tabhost 组件
- OpenGL ES基本用法
- php 126 发邮件,解析php中用PHPMailer来发送邮件的示例(126.com的例子)
- vs2008安装包及安装教程
- 用flash MX 制作 flash video
- VB认识强大的ActiveX控件
- 通过微信聊天记录生成词云
- 数独问题(java)
- 公司发给你一个gitLab账号怎么配置项目!
- word2010加载MathType打开时显示“安全警告,宏已被禁用”解决办法
- 引流软件的操作原理是怎样的,引流软件效果是不是很好?
- PhotoScan Google照片扫描仪,让手机替代扫描仪
- python做生词本_关于Kindle的生词本,你确定你都完全了解吗?