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;
    }
  • 相关阅读:
    20190710-汉诺塔算法
    20190705-Python数据驱动之DDT
    20190621-N皇后
    还在为Excel合并单元格导致的各种问题烦恼吗?这里一起解决
    Excel基础:开始菜单之对齐方式,那些被遗忘的实用功能
    Excel中身份证号码如何分段显示,难倒小编,有什么好方法吗?
    制作这样的Excel注水图表,让老板另眼相看,坐等升职加薪
    Excel高手都会的Shift快捷键7个用法,让工作效率翻倍
    Excel答粉丝问:批量将单元格内容转为批注
    Excel基础:开始菜单之字体的华丽转身
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10523652.html
Copyright © 2011-2022 走看看