面试的算法1(C语言)(整理)(组合数 字符串倒置 最大公共串)

来源:互联网 发布:临沂小商品城淘宝培训 编辑:程序博客网 时间:2024/06/04 00:53
/* 求组合数: 求n个数(1....n)中k个数的组合....           如:combination(5,3)  要求输出:543,542,541,532,531,521,432,431,421,321,*///方法1#include <stdio.h>#include<malloc.h>int *a,n,k;;int counts=0;void  comb(int m,int k){         int i,j;    for (i=m;i>=k;i--)    { a[k]=i;if (k>1)            comb(i-1,k-1);else{          counts++;                  for (j=a[0];j>0;j--)printf("%d ",a[j]);    printf("\n");}    }}void main(){       printf("Please input n:");    scanf("%d",&n);    printf("Please input k:");    scanf("%d",&k);    a=(int*)malloc(sizeof(int)*(k+1));    a[0]=k;    comb(n,k);    printf("All kinds is:%d\n",counts);}//方法2#include<stdio.h>#include<malloc.h>int n,k,*a;void comb(int N,int K){    int i;int cnt=k-K;    if(cnt<k)    {        for(i=N;i>=k-cnt;i--)        {            a[cnt]=i;            comb(i-1,K-1);        }    }    else    {        for(i=0;i<k;i++)            printf("%d ",a[i]);        printf("\n");    }}void main(){    printf("Please input n:");scanf("%d",&n);printf("Please input k:");scanf("%d",&k);    a=(int*)malloc(sizeof(int)*k);    comb(n,k);}
/*用指针的方法,将字符串“ABCD1234efgh”前后对调显示*/#include <stdio.h>#include <string>void main(){    char str[]="ABCD1234efgh";    printf("原字符串:%s\r\n",str);    char temp;    int length;    length=strlen(str);    char *p1,*p2;    p1=str;    p2=(str+length-1);    int cnt=length/2;    while(cnt--)    {temp=*p1;*p1=*p2;*p2=temp;p1++;p2--;    }    printf("倒置的字符串:%s\r\n",str);}
/*给定字符串A和B,输出A和B中的最大公共子串。比如A="aocdfe" B="pmcdfa" 则输出"cdf"*/#include <stdio.h>#include <stdlib.h>#include <string.h>char *commanstring(char shortstring[],char longstring[]){    int i,j;    char *substring =(char*) malloc(256);    if(strstr(longstring,shortstring)!=NULL)//shortstring完全在longstring中出现    //strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;如果未找到所搜索的字符串,则返回NULL。    //char *strstr(char *str1, const char *str2);    //str1被查找目标 str2: 要查找对象    <span style="white-space:pre"></span>return shortstring;    for(i=strlen(shortstring)-1;i>0;i--)//i复制的字符个数    {for(j=0;j<=strlen(shortstring)-i;j++)//j控制从shortstring第几位开始复制{    memcpy(substring,&shortstring[j],i);    //memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。    //void *memcpy(void *dest, const void *src, size_t n);    substring[i]='\0';    if(strstr(longstring,substring)!=NULL)return substring;}    }    return NULL;}void main(void){    char *str1 = "aocdfe";    char *str2 = "pmcdfa";    char *comman = NULL;    if(strlen(str1)>strlen(str2))comman= commanstring(str2,str1);    elsecomman = commanstring(str1,str2);    printf("the longest comman string is:%s\n",comman);}



0 0
原创粉丝点击