面试题33:把数组排成最小的数

来源:互联网 发布:武装党卫军 知乎 编辑:程序博客网 时间:2024/06/05 11:51
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32,  321},则输出这两个能排成的最小数字32132。

 

算法思路先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较ab,而是比较ab ba。如果ab < ba,则a < b;如果ab > ba,则a > b;如果ab = ba,则a = b。比较函数的定义是本解决方案的关键。这道题其实就是希望我们能找到一个排序规则,根据这个规则排出来的数组能排成一个最小的数字。


#include <iostream>using namespace std;int const maxNumberLength=10;char * strCombine1=new char[maxNumberLength*2+1];char * strCombine2=new char[maxNumberLength*2+1];int compare(const void * strNumber1,const void * strNumber2);void PrintMinNumber(int * numbers,int length){if(numbers==NULL||length<0)return;//根据数组长度定义一个整型的数组,返回的是一个地址,设置一个二级指针指向这个地址/*int * arr=new int[length];char ** strNumbers=(char**)arr;*/char ** strNumbers=(char **)(new int[length]);for(int i=0;i<length;i++){strNumbers[i]=new char[maxNumberLength+1];//将numbers数组中的值以%d的格式存入strnumberssprintf(strNumbers[i],"%d",numbers[i]);}//排序,并使用自定义的比较函数qsort(strNumbers,length,sizeof(char *),compare);//输出字符串for(int j=0;j<length;j++){printf("%s",strNumbers[j]);}//释放内存for(int k=0;k<length;k++){delete[] strNumbers[k];}delete[] strNumbers;}//设置自定义比较函数int compare(const void * strNumber1,const void * strNumber2){//字符串拷贝strcpy(strCombine1,*(const char **)strNumber1);//字符串连接strcat(strCombine1,*(const char **)strNumber2);strcpy(strCombine2,*(const char **)strNumber2);strcpy(strCombine2,*(const char **)strNumber1);//返回比较两个字符串的结果return strcmp(strCombine1,strCombine2);}int main(){int numbers[]={12,321,8};    PrintMinNumber(numbers,3);return 0;}

JAVA版:

自定义类,需要实现comparable,并且重写compareTo方法

public class MyString implements Comparable<MyString> {private String str;@Overridepublic int compareTo(MyString o) {String str1=this.str+o.str;String str2=o.str+this.str;return str1.compareTo(str2);}public String getStr() {return str;}public void setStr(String str) {this.str = str;}@Overridepublic String toString() {return str.toString();}}
主函数

public class MyStringTest {public static void main(String[] args) {MyString[] array=new MyString[3];array[0]=new MyString();array[0].setStr("32");array[1]=new MyString();array[1].setStr("12");array[2]=new MyString();array[2].setStr("321");Arrays.sort(array);for(int i=0;i<array.length;i++){System.out.print(array[i]);}}}

参考:http://blog.csdn.net/imzoer/article/details/8035709

0 0
原创粉丝点击