剑指45:把数组排成最小的数-----sort() ----qsort()

题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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);
}

猜你喜欢

转载自blog.csdn.net/yanbao4070/article/details/80180322