2017小红书校园招聘面试经历
2016-09-30 13:09
477 查看
小红书是上海的一家基于b2c的电商,虽然没有阿里巴巴的名气但是也是一家处于快速发展的企业,这个公司对算法比较重视,一上来就要求用递归方法写
一个全排列,幸好还记得一些思路,最后还是被我写出来了,一下是当时写的代码:
这种方法比较乱,主要思想是利用插空法,假设我们在a,b,c三个字符的情况下,我们调用函数递归调用返回b,c和c,b那么我们可以将a插入到b,c和c,b的每一位
置,那么对于b,c来说,就会有abc,bac,bca,对于c,b来说,我们就有acb,cab,cba;
但是在正常情况下,我们的输出序列为:
1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 1, 2
3, 2, 1
后来又写了另外一种方法:
再用树的结构来写一遍(这种思想用到dfs和回溯方法):
可以用STL里面的next_permutation函数实现一遍
一个全排列,幸好还记得一些思路,最后还是被我写出来了,一下是当时写的代码:
#include<iostream> #include<vector> #include<map> #include<set> #include<sstream> #include<fstream> #include<cstring> #include<stack> #include<algorithm> using namespace std; vector<vector<int>>get_all_permutation(vector<int>&data, int end){ vector<vector<int>>re; vector<vector<int>>tmp; if (end == 0){ vector<int>temp; temp.push_back(data[end]); re.push_back(temp); return re; } re = get_all_permutation(data, end - 1); for (int i = 0; i<re.size(); i++){ int count = 0; vector<int>::iterator iter; int size = re[i].size(); int index = 0; while (count != size + 1){ iter = re[i].begin(); for (int k = 0; k < index; k++)iter++; re[i].insert(iter, data[end]); tmp.push_back(re[i]); iter = re[i].begin(); for (int k = 0; k < index; k++)iter++; re[i].erase(iter); index++; count++; } } return tmp; } int main() { int num; vector<int>data; vector<vector<int>>re; int count = 1; while (count){ num = 0; if (num<1){ cout << 0 << endl; return 0; } for (int i = 1; i <= num; i++)data.push_back(i); re = get_all_permutation(data, num - 1); cout << '['; for (int i = 0; i<re.size(); i++){ cout << '['; for (int j = 0; j<re[i].size(); j++){ cout << re[i][j]; if (j != re[i].size() - 1)cout << ','; } cout << ']'; if (i != re.size() - 1)cout << ','; } cout << ']' << endl; count--; } return 0; } //Input: 数字 n //Output: 以二维数组的形式,输出[1,2,...,n]的全排列。 //例如:当n=3时,输出[[1,2,3], [1,3,2], ..., [3,2,1]] //标准解法:递归。
这种方法比较乱,主要思想是利用插空法,假设我们在a,b,c三个字符的情况下,我们调用函数递归调用返回b,c和c,b那么我们可以将a插入到b,c和c,b的每一位
置,那么对于b,c来说,就会有abc,bac,bca,对于c,b来说,我们就有acb,cab,cba;
但是在正常情况下,我们的输出序列为:
1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 1, 2
3, 2, 1
后来又写了另外一种方法:
#include<iostream> #include<string> #include<vector> #include<memory> #include<fstream> using namespace std; vector<vector<int>> get_all_permutation(vector<int>&data,int begin){ vector<vector<int>>re; vector<int>tmp; if (begin == data.size()-2){//这个时候还剩两个元素 tmp.push_back(data[begin]); tmp.push_back(data[begin+1]); re.push_back(tmp); //交换两个数 tmp[0] = tmp[0] ^ tmp[1]; tmp[1] = tmp[0] ^ tmp[1]; tmp[0] = tmp[0] ^ tmp[1]; re.push_back(tmp); return re; } re = get_all_permutation(data,begin+1); for (int i = 0; i < re.size(); i++)re[i].insert(re[i].begin(), data[begin]); int num = re.size(); for (int i = 0; i < num; i++){//将0号下标和从1号下标开始的元素交换 for (int j = 1; j < re[i].size(); j++){ tmp = re[i]; tmp[0] = tmp[0] + tmp[j]; tmp[j] = tmp[0] - tmp[j]; tmp[0] = tmp[0] - tmp[j]; re.push_back(tmp); } } return re; } int main(){ int num; vector<int>data; vector<vector<int>>re; while (cin>>num){ if (num == 0)return 0; if (num == 1){ cout << num << endl; continue; } for (int i = 1; i <= num; i++)data.push_back(i); re = get_all_permutation(data,0); cout << '['; for (int i = 0; i < re.size();i++){ cout << '['; for (int j = 0; j < re[i].size(); j++){ cout << re[i][j]; if (j != re[i].size() - 1)cout << ','; } cout << ']'; } cout << ']' << endl; data.clear(); } }
再用树的结构来写一遍(这种思想用到dfs和回溯方法):
#include<vector> #include<memory> #include<fstream> #include<stack> using namespace std; void get_all_permutation(vector<int>&data,vector<bool>&flag,vector<int>&stk){//begin代表当前的下标 int size = data.size(); if (stk.size() == data.size()){ cout << '['; for (int i = 0; i < stk.size(); i++){ cout << stk[i]; if (i != stk.size() - 1)cout << ','; } cout << ']'; return; } for (int i = 0; i < size;i++){ if (flag[i] != true){//可以继续访问 flag[i] = true; stk.push_back(data[i]); get_all_permutation(data,flag,stk); stk.pop_back(); flag[i] = false; } } } int main(){ int num; vector<int>data; vector<vector<int>>re; vector<bool>flag; while (cin>>num){ if (num == 0)return 0; if (num == 1){ cout << num << endl; continue; } for (int i = 0; i < num; i++)flag.push_back(false); for (int i = 1; i <= num; i++)data.push_back(i); cout << '['; int count = 0; vector<int>stack; get_all_permutation(data,flag,stack); cout << ']' << endl; data.clear(); flag.clear(); } }
可以用STL里面的next_permutation函数实现一遍
相关文章推荐
- 2017网易秋招内推面试经历
- 2017华为笔试、面试经历
- 2017实习生面试经历
- 2017 后端面试经历分享
- 2017 后端面试经历分享
- 2017 后端面试经历分享
- 2017 秋招 百度二轮面试—血淋淋的经历写实
- 2017微软中国社招C++研发岗面试经历(共5面)
- 2017阿里内推实习生面试经历(已获得offer)
- 2017全面JAVA面试经历总结
- 2017腾讯内推实习生面试经历(已获得offer)
- 记2017—春招,令人难忘的面试经历
- Android2017-2018最新面试题(3-5年经验个人面试经历)
- 2017 后端面试经历分享
- 阿里,华为,腾讯,小米2017实习面试经历
- 2017--就业分享之IT校招现状和面试经历
- 2017 后端面试经历分享
- [置顶] 2017腾讯暑期实习生从笔试到面试总结(附带华为、阿里面试经历)
- 电话面试经历,网易2017校招补招,机器视觉算法岗
- 2017春季实习生面试经历+找实习攻略