题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
两个重点:
(1)两个int型数字拼接起来得到的数字可能会超出int型数字能够表达的范围(大数问题)。可用字符串表示数字。
(2)定义一个新的规则来排序数组。
时间复杂度O(nlogn)
#include<cstdio>
#include<cstdlib>
#include<string>
class Solution {
public:
const int g_MaxNumberLength = 10;
char* g_StrCombine1 = new char[2 * g_MaxNumberLength + 1];
char* g_StrCombine2 = new char[2 * g_MaxNumberLength + 1];
string PrintMinNumber(vector<int> numbers) {
int length = numbers.size();
string result = "";
if(length == 0) return result;
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++)
{
result.append(strNumbers[i]);
}
for(int i = 0; i < length; i++)
delete[] strNumbers[i];
delete[] strNumbers;
return result;
}
static int compare(const void* strNumber1, const void* strNumber2)
{
strcpy(g_StrCombine1, *(char**)strNumber1);
strcat(g_StrCombine1, *(char**)strNumber2);
strcpy(g_StrCombine2, *(char**)strNumber2);
strcat(g_StrCombine2, *(char**)strNumber1);
return strcmp(g_StrCombine1, g_StrCombine2);
}
};
调试未通过 静态函数访问非静态成员变量
sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数,否则会报错。 因为:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法在sort中调用非静态成员函数。静态成员函数或者全局函数是不依赖于具体对象的, 可以独立访问,无须创建任何对象实例就可以访问。同时静态成员函数不可以调用类的非静态成员。
牛客网他人代码:
class Solution {
public:
string PrintMinNumber(vector<int> numbers) {
int len = numbers.size();
if(len == 0) return "";
sort(numbers.begin(), numbers.end(), cmp);
string res;
for(int i = 0; i < len; i++){
res += to_string(numbers[i]);
}
return res;
}
static bool cmp(int a, int b){
string A = to_string(a) + to_string(b);
string B = to_string(b) + to_string(a);
return A < B;
}
};