题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路:
使用字符串比较方式 string比较ascii码大小遇不同位或结尾结束。
sort函数 自定义一个比较函数 该比较函数是升序的(<) 这样对整数数组中的整数进行O(nlogn)的排序
方法1:sort()+string比较 升序<
class Solution { public: static bool compare(int a,int b){ string str1 = to_string(a)+to_string(b); string str2 = to_string(b)+to_string(a); return str1<str2; //升序 } string PrintMinNumber(vector<int> numbers) { string result; sort(numbers.begin(),numbers.end(),compare); for(vector<int>::iterator i=numbers.begin();i!=numbers.end();i++) result += to_string(*i); return result; } };
方法2:qsort()+二维字符串数组
//================================================================== // 《剑指Offer——名企面试官精讲典型编程题》代码 // 作者:何海涛 //================================================================== // 面试题45:把数组排成最小的数 // 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼 // 接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数 // 字能排成的最小数字321323。 #include "cstdio" #include <string.h> #include <algorithm> #define nullptr NULL 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(const int* numbers, int length) { if(numbers == nullptr || length <= 0) return; char** strNumbers = new char*[length]; //这个地方不能是非指针申请 32位和64位 系统对指针的字长不一样 for(int i = 0; i < length; ++i) { strNumbers[i] = new char[g_MaxNumberLength + 1]; sprintf(strNumbers[i], "%d", numbers[i]); printf("%s\n",strNumbers[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], 返回值小于0 int compare(const void* strNumber1, const void* strNumber2) { // [strNumber1][strNumber2] strcpy(g_StrCombine1, *(const char**)strNumber1); strcat(g_StrCombine1, *(const char**)strNumber2); // [strNumber2][strNumber1] strcpy(g_StrCombine2, *(const char**)strNumber2); strcat(g_StrCombine2, *(const char**)strNumber1); //printf("cmpchar1=%s,cmpchar2=%s\n",g_StrCombine1,g_StrCombine2); return strcmp(g_StrCombine1, g_StrCombine2); }