zoukankan      html  css  js  c++  java
  • 【面试题033】把数组排成最小的数

    【面试题033】把数组排成最小的数
    题目:
        输入一个正整数数组,把数组里所有数字拼接起来排成一个数,
        打印能拼接出的所有数字中最小的一个。
        例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。
     
    思路一:
        最直观的想法是求出所有数字的全排列,然后取最小值即可,
        根据排列组合的知识,n个数字总共有n!个排列。
     
    思路二:
        找到一个排序规则,数组根据这个规则排序之后能排成一个最小的数字。
        给出一个规则,判断给出的两个 数字m和n,判断这两个数那个应该排在前面,而不是仅仅比较这两个数字的值那个更大。
     
        隐形的大数问题:m和n都在int能表达的范围内,但把它们拼接起来的数字mn和nm用int表示就有可能溢出了。
    ——可以把数字转换成字符串来解决大数问题。
        把数字m和n拼接起来,得到mn和nm,它们的位数肯定是相同的,因此比较它们的大小只需要按照字符串大小的比较规则就可以了。
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include <iostream>
    #include <cstdlib>
    #include <string>
    #include <cstdio>
    using namespace std;

    const int g_MaxNumberLength = 10;

    char *g_StrCombine1 = new char[g_MaxNumberLength * 2 + 1];
    char *g_StrCombine2 = new char[g_MaxNumberLength * 2 + 1];


    int compare(const void *strNumber1, const void *strNumber2)
    {
        strcpy(g_StrCombine1, *(const char **)strNumber1);
        strcat(g_StrCombine1, *(const char **)strNumber2);

        strcpy(g_StrCombine2, *(const char **)strNumber2);
        strcat(g_StrCombine2, *(const char **)strNumber1);

        return strcmp(g_StrCombine1, g_StrCombine2);
    }

    void PrintMinNumber(int *numbers, int length)
    {
        if (numbers == NULL || length < 0)
        {
            return ;
        }
        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)
        {
            printf("%s", strNumbers[i]);
        }
        cout << endl;


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

    int main()
    {
        int num[] = {332321};
        int length = sizeof(num) / sizeof(num[0]);
        PrintMinNumber(num, length);
        return 0;
    }
     
  • 相关阅读:
    Juniper常用命令
    jenkins编译代码git脚本报错
    sqlserver服务器常用的性能计数器
    C语言位操作
    【转】接口技术
    【转】带参数的主函数
    进程与线程的区别和联系
    【转】进程与线程的一个简单解释
    【转】什么是堆和栈,它们在哪儿?
    【转】话说C语言const用法
  • 原文地址:https://www.cnblogs.com/codemylife/p/3745017.html
Copyright © 2011-2022 走看看