[面试] 全排列(非递归)
打印一个数组的全排列,要求非递归。
模拟递归当然会想到用栈模拟,最主要的是考虑初始的压入栈中的值,这里首先想到递归调用是用一个for循环遍历0到n-1的索引,看哪个可以用(比如k)就递归调用函数,然后返回的时候在k+1继续循环查找下去。这里的关键是如何能模拟循环的一个过程,于是我考虑到用出栈的值的下一个值来继续for循环的下一个值,于是初始从0开始,我们就可以先压入-1,然后再把它弹出栈,取下一个值作为for循环的初始值。然后当栈大小>n时打印。
1 #include <iostream> 2 #include <vector> 3 #include <stack> 4 using namespace std; 5 6 void permutation(int a[], int n) 7 { 8 vector<int> b(n); 9 vector<bool> canUse(n); 10 11 for(int i = 0; i < n; i++) 12 canUse[i] = true; 13 14 stack<int> s; 15 16 s.push(-1); 17 18 while(!s.empty()) 19 { 20 if (s.size() > n) 21 { 22 for(int i = 0; i < n; i++) 23 cout << b[i] << ' '; 24 cout << endl; 25 s.pop(); 26 continue; 27 } 28 29 if (s.top() >= 0) 30 canUse[s.top()] = true; 31 32 int start = s.top() + 1; 33 s.pop(); 34 for(int i = start; i < n; i++) 35 if (canUse[i]) 36 { 37 canUse[i] = false; 38 b[s.size()] = a[i]; 39 s.push(i); 40 s.push(-1); 41 break; 42 } 43 } 44 } 45 46 int main() 47 { 48 int a[] = {1, 2, 3}; 49 50 int aSize = sizeof(a) / sizeof(int); 51 52 permutation(a, aSize); 53 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】