21 七月 2008

一个面试题

用1、2、2、3、4、5这六数,打印出所有不同的排列,要求:"4"不能在第三位,"3"与"5"不能相连。

要求用Java做,我试着用C语言做了下。

#include <stdio.h>
int checkNum(int num);//检查是否是122345五个数字构成
int checkCondition1(int num);//先判断除了2可以重复两次以外,其它各位不能存在重复的情况
int checkCondition2(int num);//判断4是否在第三位
int checkCondition3(int num);//判断3与5是否相连
int checkIsMyNum(int num);

void main()
{
int num=122345;
int i=0;
int count=0;

for(;num<=543221;num++)
{
if(checkNum(num))
{
if(checkCondition1(num)&&checkCondition2(num)&&checkCondition3(num))
{
printf("%d ",num);
i++;
count++;
if(i==10)
{
i=0;
printf("\n");
}
}
}
}

printf("\n%d",count);
}

int checkCondition3(int num)//判断35相连
{
int temp1=num%10;
int temp2=num%10;
while(1)
{
num=num/10;
temp1=temp2;
temp2=num%10;
if((temp1==3&&temp2==5)||(temp1==5&&temp2==3))
{
return 0;
}
if(num/10==0)
{
break;
}
}

return 1;
}

int checkCondition2(int num)
{
int i=0;
while(1)
{
int temp=num%10;
i++;
if(i==3)//如果是第三位
{
if(temp==4)
{
return 0;
}
else
{
return 1;
}
}
if(num/10==0)
{
break;
}
num=num/10;
}
}

int checkIsMyNum(int num)
{
if(num==1||num==2||num==3||num==4||num==5)
{
return 1;
}
else
{
return 0;
}
}

int checkNum(int num)
{
int temp;
do
{
temp=num%10;
if(!checkIsMyNum(temp))
{
return 0;
}

if(num/10==0)
{
break;
}
num=num/10;
}while(1);

return 1;
}

int checkCondition1(int num)
{
int criterion[6]={1,2,2,3,4,5};
int i=0;


//先判断除了2可以重复两次以外,其它各位不能存在重复的情况
while(1)
{
int temp=num%10;


for(i=0;i<6;i++)
{
if(criterion[i]==temp)
{
criterion[i]=0;
break;
}
}

if(num/10==0)
{
break;
}

num=num/10;
}


for(i=0;i<6;i++)
{
if(criterion[i]>0)
{
return 0;
}
}

return 1;
}

因为限时做的,所以有点乱,没有考虑流程的优化和效率问题。最后答案是198种。

没有评论: