把数组排成最小的数
来源:互联网 发布:伺服控制系统编程 编辑:程序博客网 时间:2024/06/06 03:55
/******************************************************************题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字32132。******************************************************************/#include <stdio.h>#include <string.h>#include <algorithm>int compare(const void* strNumber1, const void* strNumber2);// int型整数用十进制表示最多只有10位const int g_MaxNumberLength = 10; char* g_StrCombine1 = new char[g_MaxNumberLength * 2 + 1];char* g_StrCombine2 = new char[g_MaxNumberLength * 2 + 1]; void PrintMinNumber(int* numbers, int length){ if(numbers == NULL || length <= 0) return; char** strNumbers = (char**)(new int[length]); for(int i = 0; i < length; ++i) { strNumbers[i] = new char[g_MaxNumberLength + 1]; sprintf(strNumbers[i], "%d", numbers[i]); } qsort(strNumbers, length, sizeof(char*), compare); for(int i = 0; i < length; ++i) printf("%s", strNumbers[i]); printf("\n"); for(int i = 0; i < length; ++i) delete[] strNumbers[i]; delete[] strNumbers;} // 如果[strNumber1][strNumber2] > [strNumber2][strNumber1], 返回值大于0// 如果[strNumber1][strNumber2] = [strNumber2][strNumber1], 返回值等于0// 如果[strNumber1][strNumber2] < [strNumber2][strNumber1], 返回值小于0int compare(const void* strNumber1, const void* strNumber2){ // [strNumber1][strNumber2] strcpy(g_StrCombine1, *(const char**)strNumber1);//这里转换的时候不能用(const char*)?,我试了下是可以的 strcat(g_StrCombine1, *(const char**)strNumber2); // [strNumber2][strNumber1] strcpy(g_StrCombine2, (const char*)strNumber2); strcat(g_StrCombine2, (const char*)strNumber1); return strcmp(g_StrCombine1, g_StrCombine2);}// ====================测试代码====================void Test(char* testName, int* numbers, int length, char* expectedResult){ if(testName != NULL) printf("%s begins:\n", testName); if(expectedResult != NULL) printf("Expected result is: \t%s\n", expectedResult); printf("Actual result is: \t"); PrintMinNumber(numbers, length); printf("\n");}void Test1(){ int numbers[] = {3, 5, 1, 4, 2}; Test("Test1", numbers, sizeof(numbers)/sizeof(int), "12345");}void Test2(){ int numbers[] = {3, 32, 321}; Test("Test2", numbers, sizeof(numbers)/sizeof(int), "321323");}void Test3(){ int numbers[] = {3, 323, 32123}; Test("Test3", numbers, sizeof(numbers)/sizeof(int), "321233233");}void Test4(){ int numbers[] = {1, 11, 111}; Test("Test4", numbers, sizeof(numbers)/sizeof(int), "111111");}// 数组中只有一个数字void Test5(){ int numbers[] = {321}; Test("Test5", numbers, sizeof(numbers)/sizeof(int), "321");}void Test6(){ Test("Test6", NULL, 0, "Don't print anything.");}int main(){ Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); return 0;}
用string类
bool compare(string str1, string str2){string combbination1 = str1 + str2;string combbination2 = str2 + str1;return combbination1 < combbination2;}void PrintMinNumber(int* arr, int length){string* numbers = new string[length];for(int i=0; i<length; ++i){stringstream strstream;strstream << arr[i];strstream >> numbers[i];}sort(numbers, numbers+length, compare);for(int i=0; i<length; ++i){cout << numbers[i];}delete[] numbers;}
==参考剑指offer
0 0
- 把数组排成最小的数--总结
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数--总结
- 把数组排成最小的数--总结
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 把数组排成最小的数
- 并发导论
- 屏蔽 TextBox自带右键菜单
- 最长回文子序列
- SEO新手别低估百度的智商
- [SPFA预处理+DP]1003: [ZJOI2006]物流运输trans
- 把数组排成最小的数
- utf ucs16
- PHP简单工厂模式
- zoj3203 Light Bulb(三分)
- 字符串处理--表达式
- Android ExpandableListView 可展开的ListView
- 求解最小生成树的算法 prim算法(附模板)
- MD5加密C实现
- activity的使用(十二):启动录音