程序员面试题100题第28题——全排列
题目:
输入一字符串,输出字符串的所有排列
分析:
我们以三个字符abc为例。首先我们固定第一个字符a,求后面两个字符bc的全排列。当bc的排列求好之后,这就是一部分解;
现在我们把第一个字符a和后面的字符b交换得到bac,固定第一个字符b,求后面两个字符ac的全排列。当ac的排列求好之后,这是另外一部分解;
接着我们该把c放在第一个位置了,为了确保这次c是和原先处于第一位置的a交换,必须把b和a交换回来,得到abc,然后再把c交换到第一位置得到cba,固定第一个字符c,求后面两个字符ba的全排列。当ba的排列求好之后,这是另外一部分解;
三部分解组成所有的解。
又如abcd
abcd
a{bcd的排列}//得到部分解
abcd //进入下一次循环保证字符交换回来
↓
abcd
bacd
b{acd的排列}//得到部分解
abcd //进入下一次循环保证字符交换回来
↓
abcd
cbad
c{bad的排列}//得到部分解
abcd //进入下一次循环保证字符交换回来
↓
abcd
dbca
d{bcd的排列}//得到部分解
abcd //进入下一次循环保证字符交换回来
下面是代码:
void Permutation(char* pStr, char* pBegin) {if(pStr==NULL || pBegin==NULL)return ;if(*pBegin == '\0'){printf("%s\n",pStr);//%s 输出整个字符串}else{for(char* pCh=pBegin; *pCh!='\0' ; ++pCh){char temp=*pCh;//交换到第一位置*pCh=*pBegin;*pBegin=temp;Permutation(pStr,pBegin+1);temp=*pCh; //交换回来使得下次循环位置不变*pCh=*pBegin;*pBegin=temp;}} } void Permutation(char* pStr) {Permutation(pStr, pStr); }
转载于:https://www.cnblogs.com/zjhnl/archive/2012/10/01/2709878.html
程序员面试题100题第28题——全排列相关推荐
- 程序员面试题100题第19题——反转链表
1 .链表相邻元素翻转 2 .题目:输入一个链表的头结点,反转该链表,返回反转后链表的头结点: LNode* ReverseLinkList(LNode* head)//带头结点 {if(head = ...
- 程序员面试题100题第17题——字符串转化为整数
题目:把输入的字符串转化为整数,如:"-456" 输出456."+456"输出456,"456"输出"456",如果是非 ...
- 程序员面试题100题第29题——调整数组顺序使奇数位于偶数前面
思想完全是采用快速排序: bool isEven_(int n)//是否是偶数 {return (n&1)==0; } void swapOddEven(int arr[], int left ...
- 程序员面试题100题第03题——求子数组的最大和
题目:输入一个整型数组,数组里有整数也有负数.数组中连续的一个或者多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值. 要求时间复杂度为O(n). 分析: 方法一: 当我们加上一个 ...
- 高薪程序员面试题精讲系列28之你熟悉哪些设计模式?
一. 面试题及剖析 1. 今日面试题 你熟悉哪些设计模式? 说说设计模式中有哪些设计原则? 2. 题目剖析 我们知道Java是一个面向对象的编程语言,所以在面试时经常会被问到我们对面向对象的理解和掌握 ...
- 程序员面试题精选100题
程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树 ...
- [程序员面试题精选100题]13.第一个只出现一次的字符
[题目] 在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b. [分析] [代码] /********************************* * 日期:2013- ...
- 程序员面试题精选100题(51)-顺时针打印矩阵
// 程序员面试题精选100题(51)-顺时针打印矩阵.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostre ...
- 程序员面试题精选100题:求从1到n的正数中1出现的次数
// 程序员面试题精选100题(25):求从1到n的正数中1出现的次数 // 如 f(253) = (2!=0) * 100 + 2 * f(99) + (5!=0) * 10 + 5 * f(9) ...
最新文章
- 11项重大发布!百度大脑语言与知识技术峰会全程高能
- java导出excel数据量大_解决大批量Excel导出OOM问题
- 北大清华团队编写!200多个科学实验+视频,和爸爸一起在家做
- java禁止修改map_Java中实现不可变Map
- spring elasticsearch 按条件删除_实战:项目数据源转为Elasticsearch
- 您的计算机无法访问dota2服务器,一招解决DOTA2国服客户端无法启动问题
- 无80端口情况下使用 CertBot 申请SSL证书 并实现自动续期
- 去《挪威的森林》之后
- 计算机顶会英文论文查找
- 2)美国佬与才女薛涛的共同点
- 搜索:Flood Fill
- 抛弃Eclipse!
- fastadmin 数据导出,设置excel行高和限制图片大小
- 软件测试-测试历史/职业发展
- 学校计算机大赛的工作总结,工作总结之中国大学生计算机设计大赛参赛经验与总结...
- U3D的坑坑洼洼(1)
- 香港《财资》2018年金融科技奖 金融壹账通、花旗银行、招商银行等登榜
- 基于CentOS7的Matomo网站统计分析工具
- 对浙江软件市场前景的看法
- 【数学建模】线性代数模型(上)