小红书是上海的一家基于b2c的电商,虽然没有阿里巴巴的名气但是也是一家处于快速发展的企业,这个公司对算法比较重视,一上来就要求用递归方法写

一个全排列,幸好还记得一些思路,最后还是被我写出来了,一下是当时写的代码:

#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小红书校园招聘面试经历相关推荐

  1. 阿里巴巴2015校园招聘面试经历(笔者面试问题----倾情奉献)

    8.29号笔试,9.1号官网显示笔试通过请预约面试时间,预约了9.17号下午三点面试. 投入更加紧张的准备中,先把项目中的各种可能被问到的细节问题想到,然后再总结自己当时的解决办法和思路.最后,把各种 ...

  2. 上海汉得校园招聘面试经历

    前天,昨天,两次面试,终于通过了.         这是一个怎样的公司,有兴趣的人相信自己会上网查的,至于面试,可以说是非常自由的形式,这是我第一次面试,大三下学期,也是人生第一次正式的面试. 由于这 ...

  3. 2017年联通软件研究院校园招聘面试经历

    本人简单做总结.笔试比较简单,都是一些基础知识,选择,简答和编程.选择包含数据库和软件开发和数据结构的一些基础知识,例如SQL语句,黑盒测试和白盒测试等,简答题就是SQL语句分类,还有就是全局变量和局 ...

  4. 华为2014校园招聘面试经历

    又到了一年的就业季,我也成了找工作的茫茫大军中的一员.因为自己的本科出身实在不敢恭维(我非常热爱我的母校),所以对自己将来读博之后的出路非常迷茫.于是开始了我的找工作征程,无论将来是否读博,我想找工作 ...

  5. 2012腾讯校园招聘面试经历

    我投的终端软件,隶属于3G产品部门.很遗憾,止步于2面.2面的知识点太广泛了,确实没有想到知识点那么广泛. 腾讯的笔试题目比较基础 具体的题目记不清除了,设计到的知识点: 1.c语言基础:sizeof ...

  6. 网易2017实习生招聘面试经历

    网易面试经历总结: 面试是在杭州网易大厦进行的,面试的职位是C++开发工程师(网易杭州)-杭州研究院-公共技术 有些问题可能不是太准确,但是大概是那个意思. 一面: 1. 自我介绍技术面的自我介绍不用 ...

  7. 阿里巴巴2015校园招聘面试大礼包

    1. 1. 阿里面试 1.1沈阳阿里2014校园招聘研发面试 日期:2013年9月 地点:沈阳 岗位:软件研发 收到通知是上午10点40的面试,因为面试地点在学校附近,所以早上9点就到了. 休息区等面 ...

  8. 华为勇敢星实习生招聘面试经历和华为优招面试经历

      我参加的是华为2017年(针对18年毕业的应届生)武长地区的华为优招,面试之前也在网上搜了很长时间的关于优招的面试经验贴,没有搜到多少相关的资料.所以写下这篇帖子,希望能够帮到后续参加华为优招的同 ...

  9. 腾讯校园招聘面试的秘密

    转自公司同事戴钊的文章 由于从事基层管理岗位的原因,最近两年有机会在武汉.南京.上海等地进行校园招聘,为公司选拔优秀人才,在这个过程中接触过一百多名各种类型的应聘毕业生,我深深为这些莘莘学子渴望进入腾 ...

最新文章

  1. vmware安装ubuntu的一些成功技巧
  2. Eclipse Java注释模板设置详解
  3. python网络爬虫_Python爬虫实战之网络小说
  4. JavaScript高级之ECMASript 7、8 、9 、10 新特性
  5. 程序员面试金典 - 面试题 04.03. 特定深度节点链表(BFS)
  6. LeetCode 137. 只出现一次的数字 II
  7. es6—变量的解构赋值
  8. JAVA中的继承和覆盖
  9. JUnit for Android入门2 JUnit断言
  10. Internet浏览器,C:\fakepath路径问题
  11. css设置动画匀速运动,CSS3 transition动画
  12. Unity_UIBuilder插件入门
  13. 基于MFC和c++的销售管理系统,课程设计,实训
  14. Python:实现currency converter货币换算算法(附完整源码)
  15. VMware安装虚拟机详细教程
  16. NUMERIC和DECIMAL区别
  17. 网络监控器mrtg全攻略
  18. 推荐语、学生和网友留言——《逆袭大学》连载
  19. 2022-2028全球与中国3-甲基吡啶市场现状及未来发展趋势
  20. 删除文件时显示该文件不在此文件夹中的原因

热门文章

  1. jsplumb流程器使用2
  2. 坑爹的铁路在线订票系统
  3. JAVA个人通讯录的实现
  4. (转载)火狐浏览器禁用检查更新
  5. js有时候不按正常的顺序执行
  6. 电商静态资源图片等存储方式以及CDN加速
  7. UWB 超宽带全向平面天线
  8. Pycharm设置快捷键改变字体大小
  9. RESA: Recurrent Feature-Shift Aggregator for Lane Detection (AAAI 2021)
  10. css引入外部字体的压缩方法,解决网页加载太慢