微软经典面试题

bastenf 2006-09-04 09:55:36
题目:给出一个函数来输出一个字符串的所有排列

想问 除了嵌套N循环的做法外,有没有其他好的办法?

...全文
4049 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
tame1983 2006-09-22
  • 打赏
  • 举报
回复
用递归方法写了一个小函数,好像还成

//用递归方法给出一个整数数组的所有排列。
void Permutation(int intLength,int intArray[],int intResult[][5])
{
//首先定义递规的出口,就是长度为2的时候,是递规的出口。
if (intLength == 2)
{
//到了最后两个数据的排列了。
intResult[0][0] = intArray[0];
intResult[0][1] = intArray[1];
intResult[1][0] = intArray[1];
intResult[1][1] = intArray[0];
}
else
{
//构造下一次递规调用的数组。
int intArrayTmp[100];
for (int i = 0 ; i < intLength ; i++)
{
intArrayTmp[i] = intArray[i+1];
}
//先求出后N-1个元素的排列结果
Permutation(intLength-1,intArrayTmp,intResult);
//求出N-1个元素的排列结果后求N个元素的排列结果。
int intPlus = GetFactorial(intLength-1); //求出前N-1的排列个数
for (int i = 1 ; i < intLength ; i++)
{
for (int j = 0 ; j < intLength-1 ; j++)
{
for(int k = 0 ; k < intPlus ; k++)
{
intResult[i*intPlus+k][j] = intResult[0+k][j];
}
}
}
//对头号元素进行按照位置的插入工作。每intPlus行对应一个插入的位置,共对应N个位置。
for (int i = 0 ; i < intLength ; i++) //i表示要插入的位置.
{
for (int j = 0 ; j < intPlus ;j++) //i*intPlus + j 表示要操作的行
{
//首先移动数据.
for (int k = intLength-1 ; k > i ; k--) //k表示现在有多少列。
{
intResult[i*intPlus + j ][k] = intResult[i*intPlus + j ][k-1];
}
//然后插入应该插入数据
intResult[i*intPlus + j ][i] = intArray[0];
}
}
}
}
a_tongm 2006-09-05
  • 打赏
  • 举报
回复
王晓东的那本算法书上有这个问题的讲解和代码,看一下吧
bineon 2006-09-05
  • 打赏
  • 举报
回复
http://www.cs.cityu.edu.hk/~luoyan/mirror/tsinghua/combinemaths/1/1_5.htm
bistar 2006-09-05
  • 打赏
  • 举报
回复
学习学习
做鸡真好吃 2006-09-05
  • 打赏
  • 举报
回复
大家给个算法名,让俺也能研究以下啊~
kangjian1 2006-09-05
  • 打赏
  • 举报
回复
Sorry. my wrong!
TMD can't input chinese!!
kangjian1 2006-09-05
  • 打赏
  • 举报
回复
I don't think it is so complex as you said!!
I think 20 lines is enough, like this:


#include <stdio.h>
#include <string.h>
#define swap(a,b){ char temp=a; a=b; b=temp; }

int main()
{
char str[]="12345";
int len = strlen(str);
int i,j;
for(j=0;j<len;j++)
for(i=0;i<len-1;i++)
{
swap(str[i],str[i+1]);
printf("%s\n",str);
}
return 0;
}
__________________ 2006-09-05
  • 打赏
  • 举报
回复
我当时写个字典生成器玩玩。用的是递归。
picklock 2006-09-05
  • 打赏
  • 举报
回复
关注
liglow 2006-09-05
  • 打赏
  • 举报
回复
可能是我误解了题目,可是我感觉是二重循环啊,有什么难的吗?
winbondowen 2006-09-04
  • 打赏
  • 举报
回复
曾经在C++算法上看到过
不过现在忘记了
是用递归做的
10行代码以内吧
herman~~ 2006-09-04
  • 打赏
  • 举报
回复
关注
qdhuxp 2006-09-04
  • 打赏
  • 举报
回复
gz
Bennyatt 2006-09-04
  • 打赏
  • 举报
回复
似乎只有穷举法
穷举还得做的有水准要能处理未知长度种类的串....
有空的话咱们大家都写几个切磋一下
bastenf 2006-09-04
  • 打赏
  • 举报
回复
能不能给个具体点的说明啊!!!这样太笼统了啊!!
IT有个圈儿 2006-09-04
  • 打赏
  • 举报
回复
关注!
AdenPlus 2006-09-04
  • 打赏
  • 举报
回复
递归和回溯应该都可以啊!
格兰特杨 2006-09-04
  • 打赏
  • 举报
回复
关注
healer_kx 2006-09-04
  • 打赏
  • 举报
回复
搜索回溯(我不太会)
xiaosong8584 2006-09-04
  • 打赏
  • 举报
回复
用 求九宫的递归算法 ,
可以实现按照字符串长度的全排列,
时间复杂度是n!
加载更多回复(13)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧