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

/*
 求组合数: 求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);
    else
	comman = commanstring(str1,str2);
    printf("the longest comman string is:%s\n",comman);
}

    原文作者:强二二
    原文地址: https://blog.csdn.net/u011385799/article/details/47362691
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞