题解|老子的全排列呢

首先,这道题要求很简单,就是要求输出1~8的全排列

这里我们需要做到:一:一个排列里,一个数字只出现一次。这里我们可以用一个布尔数组进行跟踪,通过布尔数组来判断该数字是否出现过。二:排列不能重复。这里我们可以用循环进行单向遍历,保证情况不重复。为了实现上面要求,我们需要有一个状态的记录过程,那我们很容易联想到递归。

看整体代码

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;

void pailie(vector<int> &vec,int* nums,int num);
void pri_pailie(vector<int> &vec);
int main(){
    int nums[9]={};
    vector<int> vec;
    pailie(vec,nums,8);
    return 0;
}

//核心函数就在这里
void pailie(vector<int> &vec,int* nums,int num){
    if(vec.size()>=num){	//如果向量长度已经达标,则打印输出。
        pri_pailie(vec);
        return;
    }
    if(vec.empty()) for(int i=1;i<=num;i++) nums[i]=0;
    
    for(int i=1;i<=num;i++){//遍历1~8
        if(!nums[i]){	//如果i未被访问,则push进向量传给下一个。
            vec.push_back(i);
            nums[i]=1;	//访问了,状态置为1
            pailie(vec,nums,num);
            vec.pop_back();
            nums[i]=0;	//要记得进行状态回溯
        }
    }
}
void pri_pailie(vector<int> &vec){
    for(int i=0;i<7;i++) printf("%d ",vec[i]);
    printf("%d\n",vec[7]);
}

全部评论

相关推荐

真顶不住了兄弟们…11&nbsp;月底了,秋招投了仨月,还是&nbsp;0offer,纯纯陪跑选手。从&nbsp;8&nbsp;月底就开始瞎忙活,前俩月还会为了面试挂掉崩溃到睡不着,现在心里早就没波澜了,跟一潭死水似的。不知道从啥时候起,也不焦虑了,就剩摆烂和逃避现实&nbsp;——&nbsp;简历不想改,面试题不想刷,连打开招聘软件的劲儿都没了。中间撑着我往下走的,其实是那点自我安慰:每次收到面试邀约,都告诉自己&nbsp;“挂了也没事,就当练手”,好歹能趁着准备的功夫捋捋项目逻辑,优化下面试话术,只要有进步,总能撞上一个机会。说实话也确实有点变化,从一开始一面就凉,到后来能冲进二面、三面,我还以为事情在往好的方向走…&nbsp;结果后面零星几个面试,又是一面挂、二面挂,无限循环。原来我以为的&nbsp;“进步”,根本就是自我感动的幻觉,说白了就是原地踏步。我到底收获啥了?面试还是那么拉胯,花了无数时间准备材料、练话术、做&nbsp;PPT,到最后连展示的机会都没有,每次都是不明不白被拒,纯属瞎忙活。现在彻底没面试邀约了,希望没了,动力也泄了,只剩下迷茫、麻木,还有点面试&nbsp;PTSD——&nbsp;一想到要面试就犯怵。我承认自己可能不够努力,但每次有机会的时候,我是真的拼尽全力去准备了啊。我还想再挣扎一下,还不想就这么放弃,但现在是真的没头绪了…&nbsp;到底还能做点啥,才能把这秋招的烂摊子盘活啊?
星开祈灵:我十一后才开始秋招呢,一样0offer,大不了秋招补录,春招,实习,再不济社招,冲就完了
十一月总结
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务