剑指OFFER之把数组排成最小的数(九度OJ1504)

题目描述:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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: 1504
    User: xhalo
    Language: C
    Result: Accepted
    Time:320 ms
    Memory:916 kb
****************************************************************/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏极客编程

nodejs之async异步编程

在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等。

1012
来自专栏xingoo, 一个梦想做发明家的程序员

剑指OFFER之二进制中1的个数(九度OJ1513)

题目描述: 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 输入: 输入可能包含多个测试样例。 对于每个输入文件,第一行输入一个整数T,代表测...

1949
来自专栏程序员的知识天地

Python基础为重,成就月薪过万

傻瓜式,傻瓜式的你可以直接点开进行下载,但是智能下载这版本,有的人愿意下载别的版本所以就要用到另外的方法

772
来自专栏柠檬先生

Sass 基础(六)

join() 函数    join()函数是将两个列表连接合并成一个列表。    >>join(10px 20px, 30px 40px)       (...

20510
来自专栏前端那些事

复杂值vs原始值&&内存空间

写在前面      最近在读《JavaScript启示录》,这本书不是JavaScript的详尽的参考指南,但是把对象作为了解JavaScript的透镜,受益匪...

1887
来自专栏前端桃园

通俗的方式理解动态类型,静态类型;强类型,弱类型

2054
来自专栏Python小屋

Python使用marshal模块操作二进制文件

Python标准库marshal可以进行对象的序列化和反序列化。 >>> import marshal # 待序列化的对象 >>> x1 = 30 >>> x2...

2975
来自专栏Java社区

Python 自学步骤(文中有福利)

1614
来自专栏CRPER折腾记

ES6折腾记- 模板字符串

总体来说,模板字符串的出现了,让我们的字符串拼接写的更加优美了;相当简易实用;但是这货并不是万能的,有部分unicode编码字符会造成编译报错

1013
来自专栏wym

18年暑假多校赛第一场 1002

http://acm.hdu.edu.cn/showproblem.php?pid=6299

861

扫码关注云+社区

领取腾讯云代金券