今天腾讯在学校附近招测试实习,有一同学过去面试了,问了两道题,一道是给定一个时间,问多久后秒针分针时针重合,另一道是给出一个不重复的字符串比如abcdefg ,在这7个字符里面选出3个输出,打印出所有情况。
自己想了下觉得可以用递归做,用一个visit数组表示对应的符号是否用过,程序写的比较粗糙,有错请指正
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//7选k
void zuhe(char A[],char B[],int visit[],int index,int k)
{
int i;
if(index >=k)
{
B[index] = '\0';
puts(B);
return ;
}
for(i=0;i<7;i++)
{
if(visit[i]==0)
{
visit[i]=1;
B[index]=A[i];
zuhe(A,B,visit,index+1,k);
visit[i]=0;
}
}
}
int main()
{
char A[8] = "abcdefg";
char *B ;
int visit[8];
int i;
int k;
scanf("%d",&k);
B = (char *)malloc(k*sizeof(char));
for(i=0;i<8;i++)
{
visit[i]=0;
}
zuhe(A,B,visit,0,k);
free(B);
}
也可以用剑指offer这本书上的第28道面试题的思想,代码类似,不过简介一点
#include<stdio.h>
//7选k
void swap(char *A , char *B)
{
char temp ;
temp = *A ;
*A = *B ;
*B = temp ;
}
void zuhe(char A[],int index,int k)
{
int i;
if(index >=k)
{
for(int j=0;j<k;j++)
{
printf("%c",A[j]);
}
printf("\n");
return ;
}
char temp;
for(i=index;i<7;i++)
{
swap(&A[i],&A[index]);
zuhe(A,index+1,k);
swap(&A[i],&A[index]);
}
}
int main()
{
char A[8] = "abcdefg";
int i;
int k;
scanf("%d",&k);
zuhe(A,0,k);
}