[面试算法题]小于 n 的最大数

1,454 阅读1分钟

数组A中给定可以使用的1~9的数,返回由A数组中的元素组成的小于n(n > 0)的最大数。 例如:A = {1, 2, 4, 9},n = 2533,返回2499。
测试样例1:

A = {1, 2, 4, 9}
n = 2533

输出1:

2499

测试样例2:

A = {4, 2, 9, 8}
n = 988822

输出2:

988499

测试样例3:

A = {9, 8}
n = 9

输出3:

8

测试样例4:

A = {9, 8}
n = 9

输出4:

8

测试样例5:

A = {9, 6, 3, 5}
n = 56449

输出5:

56399

测试样例6:

A = {9, 6, 3, 5}
n = 56449

输出6:

56399

代码及注释:

#include <iostream>
#include <vector>
#include <stack>
using namespace std;
// 获取数组最大的数
int getMax(vector<int> vect) {
    return vect[vect.size() - 1];
}

// 获得小于等于index的
int getIndex(int index, vector<int> vect) {
    vect.push_back(100);
    if (vect.size() && vect[0] > index) {
        return 0;
    }
    for (int i = 1; i < vect.size(); i++) {
        if (vect[i] > index) {
            return vect[i - 1];
        }
    }
    return 0;
}
// 把N转成数组
vector<int> transfN(int n) {
    stack<int> stk = stack<int>();
    vector<int> vet = vector<int>();
    while (n) {
        stk.push(n % 10);
        n /= 10;
    }
    while (!stk.empty()) {
        vet.push_back(stk.top());
        stk.pop();
    }
    return vet;
}
/// @param nums  给定数组
/// @param n  给定数字
int findMax(vector<int> nums, vector<int> n) {
    sort(nums.begin(), nums.end());//排序给定数组
    vector<int> origin(n);//保存原始数组origin
    vector<int> temp = vector<int>(n.size(), 0);
    bool flagSmall = false;//有没有找到小位,后面补0
    bool flagZero = false;//是不是少一位
    for (int i = 0; i < n.size(); i++) {
        if (flagSmall) {
            temp[i] = getMax(nums);
            continue;;
        }
        if (n[0] == 0) {
            flagZero = true;
            continue;
        }//回溯第一位为0,减一位
        int t = getIndex(n[i], nums);
        if (t == 0 && n[i] > 0) {
            n[i]--;
            i--;
            continue;
        }//判断当位
        if (n[i] == 0 || (i == n.size() - 1 && t == 0)) {
            i -= 2;
            n[i + 1]--;
            continue;
        }//回溯
        if (i == n.size() - 1 && t == origin[i]) {
            if (getIndex(n[i] - 1, nums) == 0) {
                i -= 2;
                n[i + 1] = 0;
                continue;
            } else {
                t = getIndex(n[i] - 1, nums);
            }
        }//判断最后一位,不可以相等
        if (t < origin[i]) {
            flagSmall = true;
        }// 找到小的,后面全是max
        temp[i] = t;
    }
    int answer = 0;
    if (flagZero) {//有0,少一位
        for (int i = 0; i < n.size() - 1; i++) {
            answer *= 10;
            answer += getMax(nums);
        }
    } else {//正常加起来
        for (int i = 0; i < n.size(); i++) {
            answer *= 10;
            answer += temp[i];
        }
    }
    return answer;
}

int main(int argc, const char * argv[]) {
    int n = 56449;
    vector<int> A = {9, 6, 4, 5};
    vector<int> N = transfN(n);
    int res = findMax(A, N);
    cout << res << endl;
    return 0;
}