• 面试题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;
    }
    
  • 相关阅读:
    海伦公式
    简单的博弈
    Hello World 代码
    Hello world
    99999999海岛帝国后传:算法大会
    判断质数
    idea plantUML配置
    测试用例评审
    如何编写有效测试用例
    测试用例设计——场景分析法
  • 原文地址:https://www.cnblogs.com/flyingrun/p/13531123.html
Copyright © 2020-2023  润新知