数组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;
}