广州乐地网站建设,美食推荐网站模板,做网站用哪个笔记本,最专业的营销网站建设公司排名字节经典面试题 给定一个整数n#xff0c;并从1~9中给定若干个可以使用的数字#xff0c;根据上述两个条件#xff0c;得到每一位都为给定可使用数字的、最大的小于整数n的数#xff0c;例如#xff0c;给定可以使用的数字为 {2,3,8} 三个数#xff1a;给定 n3589#x…字节经典面试题 给定一个整数n并从1~9中给定若干个可以使用的数字根据上述两个条件得到每一位都为给定可使用数字的、最大的小于整数n的数例如给定可以使用的数字为 {2,3,8} 三个数给定 n3589输出3388给定 n8234输出8233……
#include iostream
#include ostream
#include vector
#include algorithm
using namespace std;
//找到小于x的最大值
int find_x(const vectorint digits, int x) {for (auto it digits.rbegin(); it digits.rend(); it) {if (*it x) { return *it;}}return 0;
}
int process(vectorint digits, int n){sort(digits.begin(), digits.end());vectorint aim;while(n0){aim.push_back(n%10);n/10;//coutnendl;}vectorintans(aim.size(), 0);for(int iaim.size()-1; i0; i--){int now find_x(digits, aim[i]);//当前的第i位找不到不合适回溯降级需要降级if(now0 i0){while(iaim.size() now0){now find_x(digits, aim[i]);i;}//找到最高位还没有找到合适的就要降级了if(iaim.size()){ans vectorint(aim.size()-1, *(digits.end()-1));break;}else{//找到合适的了ans[i] now;for(int k0;ki;k){//后面的位都补充最大的数ans[k]*digits.end();}break;}}else if(now 0 ){now digits[0];}ans[i]now;}int ret0;for(int mans.size()-1; m0; m--){ret*10;retans[m];}return ret;
}int main()
{vectorint m_digits { 2,8,3 };cout process(m_digits, 2222) endl;return 0;
}