(C++) [バイト面接の質問] 最大数 (n は 23121 など。[2 4 9] などの配列 a が与えられた場合、a の要素で構成される n より小さい最大の数を見つけます) すべて合格

23121 などの数値 n が与えられた場合、または [2 4 9] などの一連の数値 a が与えられた場合、a の要素で構成される n より小さい最大の数値を見つけます。解決策のアイデアは暴力的な再帰です。悪いケースはまだ見つかっていません。テストしてみてください。

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
const int N = 10010;
// 小于n 的最大数
vector<int> a;
int n, ans, target;
bool flag;
void dfs(int idx, int len, int cur, int last) {
    
    
	if (idx == len) {
    
    
		if (cur < target && cur != 0) {
    
    
			ans = max(ans, cur);
		}
		return;
	}
	for (int i = 0; i <= n; i++) {
    
    
		if (i == 0) {
    
    
			if(last == 0 && !flag) dfs(idx + 1, len, cur * 10 + a[i], a[i]);
			else continue;
		}
		else {
    
    
			flag = true;
			dfs(idx + 1, len, cur * 10 + a[i], a[i]);
			flag = false;
		}
	}
}
void stdInputs() {
    
    
	ans = -1;
	cin >> n;
	flag = false;
	a.resize(n+1, 0);
	for (int i = 1; i <= n; i++) cin >> a[i];
	cin >> target;
	int len = to_string(target).length();
	dfs(0, len, 0, 0);
	cout << ans;
}
void caseTest(vector<int> tmp, int x) {
    
    
	ans = -1;
	flag = false;
	target = x;
	n = tmp.size();
	tmp.insert(tmp.begin(), 0); // 为了处理0开头的情况
	a = tmp;
	dfs(0, to_string(target).length(), 0, 0);
	cout << "test case: ";
	for (int i = 1; i < a.size(); i++) cout << a[i] << " ";
	cout << " and x = " << target << ". The ans is: " << ans << endl;
}
int main() {
    
    
	caseTest({
    
    1, 2, 4, 9}, 2533); // 2499
	caseTest({
    
     1, 2, 4, 9 }, 2409); // 2299
	caseTest({
    
     1, 2, 4, 9 }, 1111); // 999
	caseTest({
    
     1, 2, 4, 9 }, 3000); // 2999
	caseTest({
    
     1, 2, 4, 9 }, 2100); // 1999
	caseTest({
    
     1, 2, 4, 9 }, 1249); // 1244
	caseTest({
    
     1, 2, 4, 9 }, 4921); // 4919
	caseTest({
    
     1, 2, 4, 9 }, 1); // -1
	caseTest({
    
     1, 2, 3 }, 101);
	caseTest({
    
     1, 2, 9 }, 1201); // 1121
	caseTest({
    
     1, 4, 9 }, 24132);
	caseTest({
    
     1, 4, 9 }, 14132);
	caseTest({
    
     2, 4, 5 }, 24131);
	caseTest({
    
     2, 4, 9 }, 23132); // 22999
	caseTest({
    
     2, 4, 9 }, 21132); // 9999
	caseTest({
    
     2, 4, 9 }, 24132); // 19999
	caseTest({
    
     2, 4, 9 }, 14132); // 14119
	caseTest({
    
     2, 3, 5 }, 3211);
	caseTest({
    
     6, 7, 8 }, 1200);
	caseTest({
    
     6, 9 }, 95); // 69
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_42474261/article/details/125950295