劍指offer 33 把數組排成最小的數

轉載請註明出處:http://blog.csdn.net/ns_code/article/details/28128551

題目描述:

輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字爲321323。

輸入:

輸入可能包含多個測試樣例。 對於每個測試案例,輸入的第一行爲一個整數m (1<=m <=100)代表輸入的正整數的個數。 輸入的第二行包括m個正整數,其中每個正整數不超過10000000。

輸出:

對應每個測試案例, 輸出m個數字能排成的最小數字。

樣例輸入:

3
23 13 6
2
23456 56

樣例輸出:

13236
2345656

    這道題主要要自定義一個比較組合後的數字的大小的規則,主要是對於數字m和n,先將其轉化爲字符串,而後比較其組合mn和nm的大小,這裏直接按照字符串的大小標準來比較即可,最後用qsort進行排序,排序後的字符串數組中的字符串從左向右組合起來的字符串即使最小的字符串,即轉化爲整數後爲最小的整數。

    AC代碼如下:

[cpp] view plaincopy

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. char strs[100][10];  
  5. /*
  6. 自定義比較規則
  7. */
  8. int mycompare(const void *str1,const void *str2)  
  9. {  
  10. static char s1[20];  
  11. static char s2[20];  
  12. char *string1 = (char *)str1;  
  13. char *string2 = (char *)str2;  
  14. //將兩個字符串合併在一起
  15.     sprintf(s1,"%s%s",string1,string2);  
  16.     sprintf(s2,"%s%s",string2,string1);  
  17. return strcmp(s1,s2);  
  18. }  
  19. /*
  20. 以字符串形式打印出最小的整數
  21. */
  22. void PrintMinNum(int *nums,int len)  
  23. {  
  24. if(nums==NULL || len<1)  
  25. return;  
  26. int i;  
  27. //將整數寫入到字符串中
  28. for(i=0;i<len;i++)  
  29.         sprintf(strs[i],"%d",nums[i]);  
  30. //按照mycompare中指定的規則排序
  31.     qsort(strs,len,10*sizeof(char),mycompare);  
  32. for(i=0;i<len;i++)  
  33.         printf("%s",strs[i]);  
  34.     printf("\n");  
  35. }  
  36. int main()  
  37. {  
  38. int nums[100];  
  39. int m;  
  40. while(scanf("%d",&m) != EOF)  
  41.     {  
  42. int i;  
  43. for(i=0;i<m;i++)   
  44.             scanf("%d",nums+i);  
  45.         PrintMinNum(nums,m);  
  46.     }  
  47. return 0;  
  48. }  

/**************************************************************

Problem: 1504

User: mmc_maodun

Language: C++

Result: Accepted

Time:240 ms

Memory:1020 kb

****************************************************************/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章