贝壳面试php算法,贝壳2019秋招提前批算法笔试题目“丢失的卡片”

#include #include#include#include#include#include

using namespacestd;void help1(vector& count, intn) {string str =to_string(n);for (int i = 0; i

count[str[i]- '0']++;

}

}void help2(vector& count, intn) {string str =to_string(n);for (int i = 0; i

count[str[i]- '0']--;

}

}bool stop1(vector& num, vector&count) {for (int i = 0; i<10; i++) {if (count[i]

}return 1;

}bool stop2(vector& num, vector&count) {for (int i = 0; i<10; i++) {if (count[i] !=num[i])return 0;

}return 1;

}void backtrack3(vector& nums, vector& vis, int curSize, int&len,

vector& path, vector >&res) {if (curSize ==len) {//此时 path 已经保存了 nums 中的所有数字,已经成为了一个排列

res.push_back(path);return;

}for (int i = 0; i

if (i>0 && nums[i] == nums[i - 1] && vis[i - 1]) continue;

path.push_back(nums[i]);

vis[i]= true;

backtrack3(nums, vis, curSize+ 1, len, path, res);//刚开始接触回溯算法的时候常常会忽略状态重置//回溯的时候,一定要记得状态重置

path.pop_back();

vis[i]= false;

}

}

}

vector > permuteUnique(vector&nums) {

vector >res;int len =nums.size();if (len == 0) return{ {} };

sort(nums.begin(), nums.end());

vector vis(len, 0);

vectorpath;

backtrack3(nums, vis,0, len, path, res);returnres;

}bool input(vector&num) {intcur;bool sign = 0;if (cin >>cur) {

sign= 1;

num[0] =cur;for (int i = 1; i < 10; i++) {

cin>>num[i];

}

}returnsign;

}intmain() {

vector num(10);while(input(num)) {

vector count(10, 0); //记录1~N 所有数字出现的次数

int tar = 1;bool sign = 1;while (tar<=1000) {

help1(count, tar);if(stop1(num, count)) {

sign= 0;break;

}

tar++;

}if(sign) {

cout<< "NO ANSWER\n";continue;

}for (int i = 1; i <= tar; i++) {

vector count_temp =count;

help2(count_temp, i);if(stop2(num, count_temp)) {

cout<< tar << " " << i <

}

}/*vector number;

for (int i = 0; i<10; i++) {

if (num[i] < count[i]) {

for (int j = 0; j < count[i] - num[i]; j++) {

number.push_back(i);

}

}

}

vector > x_res = permuteUnique(number); //leetcode47

for (int i = 0; i

if (x_res[i][0] == 0) continue;

int x = 0;

for (int j = 0; j

x = x * 10 + x_res[i][j];

if (x>tar) break;

}

if (x <= tar) {

cout << tar << " " << x << endl;

}

}*/}return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值