C++笔试题

现在将会写一系列各种IT公司招聘的笔试面试题博客(自己学习和讨论)。

欢迎大家提出好的意见。共同讨论,共同进度。


一.字符串或数字的全排列问题(百度笔试题)

题目:

求一个全排列函数,如P([1,2,3])输出:

【123】、【132】、【213】、【231】、【321】、【312】

解答:


方法一:

一个数或(字符)的全排列是其本身,比如1的全排列就是1

两个数或(字符)的全排列是将其交换,比如12的全排列是12,21

三个数的全排列:1.可以将第一个数不变,后面进行全排列,1不变,23全排列,结果为123,132

                                        2.将第二个数与第一个数交换,然后将后面的数全排列,2不变,13全排列,结果为,213,231

                                        3.姜第三个数与第一个数交换,然后将后面的数全排列,3,不变,21排列,结果为 321,312

       四个以此类推……

这是一种递归的方法,将大的问题,逐步小化。



方法二:

运用STL中的求下一个排列的思想。

        1.运用STL的sort()将数组进行排序。

         2.运用next_permutation();求下一个排列



代码实现:

方法一:

[cpp]  view plain copy
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. void swap(char& a,char& b)  
  6. {  
  7.     char temp;  
  8.     temp=a;  
  9.     a=b;  
  10.     b=temp;  
  11.   
  12.   
  13.   
  14. }  
  15.   
  16. void permutation(char* str,int k,int m)  
  17. {  
  18.     if (k>m)  
  19.     {  
  20.         cout<<str<<endl;  
  21.     }  
  22.     else  
  23.     {  
  24.         for (int i=k;i<=m;i++)  
  25.         {  
  26.             swap(*(str+k),*(str+i));  
  27.             permutation(str,k+1,m);  
  28.             swap(*(str+k),*(str+i));  
  29.   
  30.         }  
  31.     }  
  32. }  
  33.   
  34. int main()  
  35. {  
  36.     char str[]="123";  
  37.   
  38.     permutation(str,0,2);  
  39.     return 0;  
  40. }  

方法二:

[cpp]  view plain copy
  1. #include <iostream>  
  2.   
  3. #include <algorithm>  
  4.   
  5. using namespace std;  
  6.   
  7.   
  8. void permutation(char* str, int k, int m)  
  9. {  
  10.     sort(str,str+strlen(str));  
  11.   
  12.     int i=k;  
  13.   
  14.     do   
  15.     {  
  16.         cout<<str<<endl;  
  17.   
  18.   
  19.     } while (next_permutation(str,str+strlen(str)));  
  20. }  
  21.   
  22. int main()  
  23. {  
  24.     char str[]="123";  
  25.     permutation(str,0,2);  
  26.     return 0;  
  27. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值