题目描述:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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. C#反射机制介绍

    反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等.       ...

  2. Android开发之 android:windowSoftInputMode属性详解

    android:windowSoftInputMode activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性. 这个属性能影响两件事情: [一] ...

  3. Ubuntu设置中文

    Ubuntu设置中文:需要联网下载中文包,不然无法设置中文系统. 进去系统后再右上角有个齿轮图标点击,找到系统设置(System Settings)点击弹出一个界面,找到Language Suppor ...

  4. python扩展实现方法--python与c混和编程

    前言 需要扩展Python语言的理由: 创建Python扩展的步骤 1. 创建应用程序代码 2. 利用样板来包装代码 a. 包含python的头文件 b. 为每个模块的每一个函数增加一个型如PyObj ...

  5. Ildasm.exe(MSIL 反汇编程序)

    MSIL 反汇编程序是 MSIL 汇编程序 (Ilasm.exe) 的伙伴工具. Ildasm.exe 采用包含 Microsoft 中间语言 (MSIL) 代码的可迁移可执行 (PE) 文件,并创建 ...

  6. SQL注入攻击的种类和防范手段

    观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的.虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施. ...

  7. FZU1686 神龙的难题 dancing links 重复覆盖

    分析:每次可以打一个小矩阵的怪,然后把每个怪看成一列,然后每个小矩阵看成一行,枚举左上角就行 注:然后注意总共的节点数是新图的行*列的个数,不是原图 #include<cstdio> #i ...

  8. umask设置导致程序权限不足的问题

    这几天邮件告警总是发不了邮件,查看了下zext_msmtp.sh的日志,发现总是提示权限不足…… 于是切换为zabbix的账户,发现在msmtp的目录下连ls都无法执行. 之后发现是umask的问题, ...

  9. iOS程序性能优化

    iOS程序性能优化 一.初级 使用ARC进行内存管理 在iOS5发布的ARC,它解决了最常见的内存泄露问题.但是值得注意的是,ARC并不能避免所有的内存泄露.使用ARC之后,工程中可能还会有内存泄露, ...

  10. js基础第八天

    返回前面起第一个字符位置 indexOf("sdfsdf");它是从左边索引为0开始数,而且只找第一个,然后返回该字符的位置.返回是个数值.如果找不到该字符,那么就会返回-1. 返 ...