题目描述:

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

输入:

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

输出:

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

样例输入:

样例输出:

解题思路:

  首先,最普通的思路就是权进行一次排列,找出最小的数。但是这样可能会超时。

  这里,我们首先对数列进行排序,最后进行一次整合。算法上面主要采取冒泡排序,对每个数与其前面的数进行比较。

void bubbleSort(char c[][],int n){
int i,j;
for( i=n- ; i> ; i-- ){
for(j = n-;j>(n--i);j--){
if(findSmall(c,j))
swap(c,j,j-);
}
}
}

在比较时,采用特别的思路----把两个字符串进行拼接,如果字符串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[][],int n);
int findSmall(char c[][],int i);
void swap(char c[][],int i,int j);
int main(){
int n,i;
while(scanf("%d",&n)!=EOF && n> && n<= ){
int arr[];
char c[][];
char string[];
for(i=;i<n;i++){
scanf("%d",&arr[i]);
sprintf(c[i],"%d",arr[i]);
}
bubbleSort(c,n);
strcpy(string,c[]);
for(i=;i<n;i++){
strcat(string,c[i]);
}
printf("%s\n",string);
}
return ;
}
void bubbleSort(char c[][],int n){
int i,j;
for( i=n- ; i> ; i-- ){
for(j = n-;j>(n--i);j--){
if(findSmall(c,j))
swap(c,j,j-);
}
}
}
int findSmall(char c[][],int i){
char stri[];
char strj[];
strcpy(stri,c[i]);
strcpy(strj,c[i-]);
strcat(stri,c[i-]);
strcat(strj,c[i]);
int k;
int length = strlen(stri);
for(k=;k<length;k++){
if(stri[k] == strj[k])
continue;
else if(stri[k] < strj[k]){
return ;
}else{
return ;
}
}
}
void swap(char c[][],int i,int j){
char tmp[];
int k;
for(k=;k<;k++){
tmp[k] = c[i][k];
c[i][k] = c[j][k];
c[j][k] = tmp[k];
}
}
/**************************************************************
Problem: 1504
User: xhalo
Language: C
Result: Accepted
Time:320 ms
Memory:916 kb
****************************************************************/

剑指OFFER之把数组排成最小的数(九度OJ1504)的更多相关文章

  1. 剑指Offer:把数组排成最小的数【45】

    剑指Offer:把数组排成最小的数[45] 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如,输入数组是{3.32.321},则打印出来的这3 ...

  2. 力扣 - 剑指 Offer 45. 把数组排成最小的数

    题目 剑指 Offer 45. 把数组排成最小的数 思路1 将整数数组转化成字符串数组 然后使用Arrays工具类的sort方法帮助我们排序 代码 class Solution { public St ...

  3. 【剑指Offer】把数组排成最小的数 解题报告(Python)

    [剑指Offer]把数组排成最小的数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  4. 【Java】 剑指offer(45) 把数组排成最小的数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接 ...

  5. Go语言实现:【剑指offer】把数组排成最小的数

    该题目来源于牛客网<剑指offer>专题. 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字 ...

  6. 《剑指offer》把数组排成最小的数

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  7. 《剑指offer》---把数组排成最小的数

    本文算法使用python3实现 1 题目描述:   输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组 $ [3,32,321] $ ,则打印出这 ...

  8. 剑指OFFER之旋转数组的最小数字(九度OJ1386)

    题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...

  9. 剑指offer系列58---把数组排成最小的数

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

随机推荐

  1. Hadoop课程介绍

    一.课程简介 1. Hadoop是什么? Apache Hadoop是一款支持数据密集型分布式应用并以Apache 2.0许可协议发布的开源软件框架.它支持在商品硬件构建的大型集群上运行的应用程序.H ...

  2. HAOI2007 理想的正方形

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1402  Solved: 738[Submit][Sta ...

  3. 银行爱“IOE”爱得有多深

    本文由阿尔法工场欧阳长征推荐 导读:如果银行是一家海鲜酒楼,把IBM换掉相当于大搞一次装修,把Oracle换掉相当于把厨子和菜谱全部换掉,把EMC换掉相当于把放食材工具的储物间换个地方.难度在于,这海 ...

  4. 关闭 VS的实时调试器

    可以这样关闭: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger HKEY_LOCAL_ ...

  5. ↗☻【编写可维护的JavaScript #BOOK#】第9章 将配置数据从代码中分离出来

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  6. Java [leetcode 16] 3Sum Closest

    题目描述: Given an array S of n integers, find three integers in S such that the sum is closest to a giv ...

  7. POJ 1067 取石子游戏

    题意:有两堆个数分别为a和b的石子,两个人轮流取石子,一次可以取一堆中任意个数的石子,或者在两堆中取相同个数的石子,最先没有石子可以取的人输,你先取,赢为1输为0. 解法:威佐夫博弈.看完题先找规律, ...

  8. 17、手势(Gesture)

    课程目标: 学习Android必不可少的手势的功能 了解手势识别原理 , 掌握制作,加载以及识别手势 写出自己的手势Demo 重点难点:手势机制的了解     手势库的制作 考核目标:请说一下手势库的 ...

  9. 11、四大组件之二-Service高级(二)Native Service

    一.Service的分类 1.1>Android Service 使用Java编写在JVM中运行的服务 1.2>Native Service 使用C/C++完成的服务,一般在系统开始时完成 ...

  10. WebDriver打开浏览器-java

    环境:配置jdk.使用Eclipse(个人爱好),导入selenium-java-2.42.2.jar.selenium-java-2.42.2-srcs.jar.selenium-server-st ...