剑指offer-把数组排成最小的数

/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//

/*
Q:
    把数组排成最小的数:
        输入一个正整数数组,把数组里面所有的数字拼接起来排成一个数,打印能拼接的所有数字最小的一个。
S:
    定义一种组合的规则,对于m和n两个数,如果mn>nm,那么m>n;如果mn<nm,那么m<n;否则m=n。
    然后由于数字的拼接可能会导致大数问题,这里采用字符串的方式去做。

*/

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>

const int g_MaxNumberLength = 10;
char*g_StrCombine1 = new char[g_MaxNumberLength + 1];
char*g_StrCombine2 = new char[g_MaxNumberLength + 1];

int compare(const void*str1, const void*str2)
{
    strcpy(g_StrCombine1, *(const char**)str1);
    strcat(g_StrCombine1, *(const char**)str2);

    strcpy(g_StrCombine2, *(const char**)str2);
    strcat(g_StrCombine2, *(const char**)str1);

    return strcmp(g_StrCombine1, g_StrCombine2);
}

int compare_max(const void*str1, const void*str2)
{
    strcpy(g_StrCombine1, *(const char**)str1);
    strcat(g_StrCombine1, *(const char**)str2);

    strcpy(g_StrCombine2, *(const char**)str2);
    strcat(g_StrCombine2, *(const char**)str1);

    return strcmp(g_StrCombine2, g_StrCombine1);
}

void printMinNUmber(int*number, int length)
{
    if(number == nullptr || length <= 0)
        return;
    
    char**strBums = (char**) (new int[length]);
    for(int i = 0; i < length; ++i)
    {
        strBums[i] = new char[g_MaxNumberLength + 1];
        sprintf(strBums[i], "%d", number[i]);
    }

    qsort(strBums, length, sizeof(char*), compare);

    for(int i = 0; i < length; ++i)
        std::cout << strBums[i];
    std::cout << std::endl;

    for(int i = 0; i < length; ++i)
        delete[] strBums[i];
    delete[] strBums;
}

void printMaxNUmber(int*number, int length)
{
    if(number == nullptr || length <= 0)
        return;
    
    char**strBums = (char**) (new int[length]);
    for(int i = 0; i < length; ++i)
    {
        strBums[i] = new char[g_MaxNumberLength + 1];
        sprintf(strBums[i], "%d", number[i]);
    }

    qsort(strBums, length, sizeof(char*), compare_max);

    for(int i = 0; i < length; ++i)
        std::cout << strBums[i];
    std::cout << std::endl;

    for(int i = 0; i < length; ++i)
        delete[] strBums[i];
    delete[] strBums;
}

void test_1()
{
    std::cout << "Test 1" << std::endl;
    int num[] = {3, 32, 321};
    for(auto e:num)
        std::cout << e << " ";
    std::cout << std::endl;
    printMinNUmber(num, 3);
    printMaxNUmber(num, 3);
}

void test_2()
{
    std::cout << "Test 2" << std::endl;
    int num[] = {3, 3, 321};
    for(auto e:num)
        std::cout << e << " ";
    std::cout << std::endl;
    printMinNUmber(num, 3);
    printMaxNUmber(num, 3);
}

void test_3()
{
    std::cout << "Test 3" << std::endl;
    int num[] = {3};
    for(auto e:num)
        std::cout << e << " ";
    std::cout << std::endl;
    printMinNUmber(num, 1);
    printMaxNUmber(num, 1);
}

void test_4()
{
    std::cout << "Test 4" << std::endl;
    int*num = nullptr;
    // for(auto e:num)
    //     std::cout << e << " ";
    // std::cout << std::endl;
    printMinNUmber(num, 0);
    printMaxNUmber(num, 0);
}

void test_5()
{
    std::cout << "Test 5" << std::endl;
    int num[] = {1,2,3,};
    for(auto e:num)
        std::cout << e << " ";
    std::cout << std::endl;
    printMinNUmber(num, 3);
    printMaxNUmber(num, 3);
}

void test_printMinNUmber()
{
    test_1();
    test_2();
    test_3();
    test_4();
    test_5();
}

int main(int argc, char**argv)
{

    test_printMinNUmber();

    return 0;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值