zoukankan      html  css  js  c++  java
  • 《剑指offer》第四十五题(把数组排成最小的数)

    // 面试题45:把数组排成最小的数
    // 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼
    // 接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数
    // 字能排成的最小数字321323。
    
    #include <iostream>
    #include <string>
    #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(const int* numbers, int length)
    {
        if (numbers == nullptr || length <= 0)
            return;
    
        char** strNumbers = (char**)(new int[length]);//通过下面这个循环,把number里的每个数字,转化为strNumbers的二维数组中,注意**
        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]);//将排序好的strNumbers逐个元素打印出来,即最小值
        printf("
    ");
    
        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)//qsort的第四个参数,cmp函数,详见博客
    {
        // [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);
    
        return strcmp(g_StrCombine1, g_StrCombine2);
    }
    
    // ====================测试代码====================
    void Test(const char* testName, int* numbers, int length, const char* expectedResult)
    {
        if (testName != nullptr)
            printf("%s begins:
    ", testName);
    
        if (expectedResult != nullptr)
            printf("Expected result is: 	%s
    ", expectedResult);
    
        printf("Actual result is: 	");
        PrintMinNumber(numbers, length);
    
        printf("
    ");
    }
    
    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", nullptr, 0, "Don't print anything.");
    }
    
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
        system("pause");
        return 0;
    }
  • 相关阅读:
    uIP tcp/ip协议分析及其在嵌入式系统中的应用
    围棋学习网站 (updating)
    几种代价函数
    浅谈围棋自学入门 写给想自学围棋的业余爱好者
    在 Ubuntu Natty 中解除系统托盘限制
    MATLAB中的CELL用法
    支持向量机(SVM)
    成功思维的三十个模式
    Microsoft Kinect SDK vs PrimeSense OpenNI
    生命中的选择
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10523652.html
Copyright © 2011-2022 走看看