同学遇到的面试问题,大意是M台机器放在N个房间,不使用递归求打印所有情况

解题思路:情况共计N**M种。开始想将所有情况放入数组,填充好数组再逐个打印。随后发现按照填充的思路,不使用大数组也可以实现。思路是加入M=N=3,则27种情况,记i0...i26。0...M个数,0放入i0[0],i1[1],i2[2],i3[0],i4[1],i5[2]...,1放入i0[,i1,i2,

房间0 房间1 房间2
0 1 2
1 2 0
1 2 0
0 2 1
2 0 1
2 1 0
0 2 1
2 0 1
2 0 1
0 1 2
1 0 2
1 2 0
0 1 2
0 1 2
1 2 0
0 2 1
0 2 1
2 0 1
/*  * 非递归打印全排列。 */
public class Permutations {  static void swap(char[] s, int i, int j) {  char c = s[i];  s[i] = s[j];  s[j] = c;  }  static void fullPermutation(char[] s) {  for (int i = 0; i < s.length; i++) {  for (int j = 1; j < s.length; j++) {  swap(s, j, j - 1);  System.out.println(s);  }  }  }  public static void main(String[] args) {  fullPermutation("1234".toCharArray());  }
}  


类似的问题非递归打印组合数。例如Cmn。建立长度为m的数组,前n个置为1。从左到右扫描数组元素值的10组合,找到第一个10组合后将其变为01并将其左边的1移动到最左端。

/* * 非递归打印组合数 */
public class Combinations {  static void swap(int[] a, int i, int j) {  int t = a[i];  a[i] = a[j];  a[j] = t;  }  static void print(char[] s, int[] t) {  for (int i = 0; i < t.length; i++) {  if (t[i] == 1)  System.out.print(s[i] + " ");  }  System.out.println();  }  public static void combinations(char[] s, int n) {  int[] t = new int[s.length];  int m = t.length;  for (int i = 0; i < n; i++)  t[i] = 1;  print(s, t);  while (true) {  int i;  for (i = 1; i < m; i++) {  if (t[i] == 0 && t[i - 1] == 1) {  swap(t, i, i - 1);  int p = -1;  for (int j = 0; j < i - 1; j++) {  if (t[j] == 1) {  swap(t, ++p, j);  }  }  print(s, t);  break;  }  }  if (i == m) {  return;  }  }  }  public static void main(String[] args) {  char[] s = "12345".toCharArray();  combinations(s, 2);  }
}  

不使用递归求全排列和组合数相关推荐

  1. Java递归求全排列详解

    Java递归求全排列详解 推荐博客: 博客园Java全排列递归算法,结尾的解释很形象了 csdn的大佬写的,和我下面的代码思路基本一致 全排列的递归思想解释: 全排列的数学定义就不再过多解释,考虑递归 ...

  2. 递归求全排列的学习与理解

    递归求全排列 全排列: 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列. 例题: 输出自然数 1 到n所有 ...

  3. 递归 求全排列与全组合

    我在百度,触宝面试的时候,他们都问到了递归. 递归是一个很有意思的问题,其中的经典问题有汉诺塔,fibonacci 数列问题.汉诺塔是比较难的问题,fibonacci 是比较简单的问题. 触宝面试的时 ...

  4. 三种求全排列方式之比较

    一共有三种求全排列的方式: 第一种就是只适合用于非可重集的DFS实现 第二种就是可以用于可重集上的刘汝佳书上的代码 第三种就是STL中的next--permutation 在对这三种方式做了比较之后发 ...

  5. 蓝桥杯笔记:(给的元素不重复)求全排列(排列不可重复,排列可重复)

    1.各个元素不重复 abc,acb,....... 用next_permutataion()求全排列 #include<iostream> #include<algorithm> ...

  6. C++ STL求全排列和组合

    C++11 STL内置了求全排列的模板函数next_permutation和prev_permutation,属于<algorithm>头文件和std命名空间,使用非常方便.例如: vec ...

  7. 《算法竞赛进阶指南》打卡-基本算法-AcWing 94. 递归实现排列型枚举:dfs、二进制状态压缩

    文章目录 题目解答 题目来源 题目解答 分析: dfs求全排列,这里是用二进制状态压缩进行优化,二进制状态压缩,顾名思义,每个状态是用二进制的某一位表示.这里的体现是state这个状态,它的每一位代表 ...

  8. PermutationsUnique,求全排列,去重

    问题描述:给定一个数组,数组里面有重复元素,求全排列. 算法分析:和上一道题一样,只不过要去重. 3 import java.util.ArrayList; 4 import java.util.Ha ...

  9. python关于递归求组合与组合数-通过阶乘, fibonacci加深对递归的理解

    python关于递归求组合与组合数: 首先需要找到递归的突破口. 要求如下: Exercise 3: Enumerating Combinations You need to write a func ...

最新文章

  1. TiKV 成功晋级 CNCF 孵化项目
  2. 再次分享一个多选文件上传方案“.NET研究”
  3. count_sort计数排序OpenMP的并行化
  4. 第四课-程序的循环结构
  5. 直接通过ADO操作Access数据库(修改版)
  6. 两数据库Dblink数据抽取blob
  7. SI和DI寄存器(0703)
  8. dbf如何导入oracle_克服Oracle导数一切难题
  9. 再看《JavaScript高级程序设计》第8-9章
  10. php 时间戳 24小时制,如何在php中添加24小时的unix时间戳?(How do I add 24 hours to a unix timestamp in php?)...
  11. php通用查询系统excel,php+excel通用课表查询系统
  12. 阵列信号处理学习小结
  13. xcode 可以打开xmind_思维导图,原来Xmind这么强大
  14. 时间序列之向量自回归检验VAR(自相关性)(2)
  15. 图像处理算法之模糊检测
  16. chrome浏览器去除蓝色边框和黄色背景色
  17. 近岸蛋白递交注册:年营收3.4亿 朱化星控制71.24%表决权
  18. strawberry perl环境安装介绍
  19. (附源码)计算机毕业设计SSM基于web的网上订餐系统
  20. 灵魂拷问:Java的可变参数究竟是怎么一回事?

热门文章

  1. 第二代NumPy?阿里开源超大规模矩阵计算框架Mars
  2. 福利丨一门面向所有人的人工智能公开课:MIT 6.S191,深度学习入门
  3. (如何从一个列表中随机抽样)np.random.choice(),random.sample()
  4. visual studio code(vs code)如何更换颜色背景
  5. 诺奖10年,干细胞领域再突破!华大单细胞技术助力获得人类体外诱导全能干细胞...
  6. 世界首富太空争霸:从地上斗到天上,马斯克VS贝索斯,谁能赢
  7. MEMS传感器的未来在哪?
  8. 今年的谷歌I/O大会,或许会有这些东西
  9. 斯坦福大学陈丹琦等人解读机器阅读最新进展:超越局部模式匹配
  10. 工业互联网平台创新发展白皮书(2018)