zoukankan      html  css  js  c++  java
  • 面试题45:把数组排成最小的数

    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

    解题思路

    • 回溯法(较暴力)
    • 重新定义比较数字函数(较高级)

    上代码(C++香)

    法一,回溯法递归出全排列
    #include <iostream>
    #include <vector>
    #include <stack>
    #include <string>
    #include <cstring>
    #include <queue>
    #include <algorithm>
    #include <stdlib.h>
    #include "TreeNode.h"
    using namespace std;
    
    string minS = "99999999";
    
    void mySwap(vector<int> &num, int i, int j){
        int temp = num[j];
        num[j] = num[i];
        num[i] = temp;
    }
    
    bool isSwap(vector<int> num, int index, int n){
        for(int i = index + 1; i < n; i++){
            if(num[i] == num[index])
                return false;
        }
        return true;
    }
    
    void dfs(vector<int> &num, int index, int n){
    
        if(index == n){
            string nowS;
            for(int i = 0; i < n; i++)
                nowS = nowS + to_string(num[i]);
    
            if(nowS < minS)
                minS = nowS;
            return ;
        }
        for(int i = index; i < n; i++){
            if(isSwap(num, i, n)){
                mySwap(num, i, index);
                dfs(num, index + 1, n);
                mySwap(num, i, index);
            }
        }
    }
    
    // 使用全排列来判断
    string PrintMinNumber(vector<int> numbers) {
        dfs(numbers, 0, numbers.size());
        return minS;
    }
    
    
    int main()
    {
        vector<int> num;
        num.push_back(3);
        num.push_back(32);
        num.push_back(321);
        cout<<PrintMinNumber(num)<<endl;
        return 0;
    }
    
    法二:重新定义数字的比较函数

      比如数字332,因为323<332,所以32<3

    #include <iostream>
    #include <vector>
    #include <stack>
    #include <string>
    #include <cstring>
    #include <queue>
    #include <algorithm>
    #include <stdlib.h>
    #include "TreeNode.h"
    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(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]);
        printf("
    ");
    
        for(int i = 0; i < length; i++)
            delete[] strNumbers[i];
        delete[] strNumbers;
    }
    
    int main()
    {
        int num[] = {3,32,321};
    
        PrintMinNumber(num, 3);
    
        return 0;
    }
    
  • 相关阅读:
    redis.conf 参数说明
    BD2 catalog编目
    Altium Designer -在PCB中统一修改元器件标号的位置
    AD使用技巧-怎样绘制圆形敷铜
    运放压百率
    Altium designer 新建快捷键
    修改AD中PCB各层的透明度
    Altium Designer 使用小技巧2
    Altium Designer 使用中的小技巧1
    网络库的设计与实现
  • 原文地址:https://www.cnblogs.com/flyingrun/p/13531123.html
Copyright © 2011-2022 走看看