程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 劍指OFFER之把數組排成最小的數(九度OJ1504)

劍指OFFER之把數組排成最小的數(九度OJ1504)

編輯:關於C語言

題目描述:

輸入一個正整數數組,把數組裡所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{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
****************************************************************/

 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved