笔试题(1)

来源:互联网 发布:中国帝国 知乎 编辑:程序博客网 时间:2024/06/10 07:12

今天发现一道题,是某一个笔试的最后一道。我用C语言实现了一下。整体感觉不是很难,给大家分享一下。

来看题目:
给定一个 query 和一个 text,均由小写字母组成。
要求在 text 中找出以同样的顺序连 续出现在 query 中的最长连续字母序列的长度。
例如, query 为“acbac”,text 为 “acaccbabb”,
那么 text 中的“cba”为最长的连续出现在 query 中的字母序列,因此, 返回结果应该为其长度 3

总的来说就是在字符串里找寻匹配的小字符串的个数。

总体思路应该是:先从text中的’a’开始,与query中的’a’相等,两个都递增。text中的’c’与query中的’c’右相等,再两个递增。此时,text中的’b’不等于query中的’a’。返回到text中的’a’,query中的’c’(增了一位)。接下来就是text中的’a’开始,与query中的第二个字符’c’比较….,以此类推。等到text中的’a’与query中的字符比较完。在轮到’c’,再到’b’…,以此类推。

来看代码:

#include<stdio.h>#include<stdlib.h>#include<string.h>/*给定一个 query 和一个 text,均由小写字母组成。要求在 text 中找出以同样的顺序连 续出现在 query 中的最长连续字母序列的长度。例如, query 为“acbac”,text 为 “acaccbabb”,那么 text 中的“cba”为最长的连续出现在 query 中的字母序列,因此, 返回结果应该为其长度 3*///query:“acbac”//text:“acaccbabb”int query(char *query,char *text){    int i,j,len,len2,max = 0,count = 0;    len = strlen(text);    len2 = strlen(query);    if(query == NULL || text == NULL || len <= 0)    {        return -1;    }    for(i=0;i<len;i++)//循环针对text    {           int tmp = i;        count = 0;        for(j=0;j<len2;j++)        {            if(text[tmp] == query[j])//相同的话同时移动            {                count++;                tmp++;                if(count > max)                    max = count;             }            else            {                tmp = i;                j -= count;//j-count就是之前的刚开始的j,之后j++就到了应该重新开始的位置                count = 0;                continue;            }        }    }    return max;}   int main(){    int max = query("ccbac","acdbabac");    printf("%d",max);    return 0;}   

结果:
3

经过人工的检查,结果正确。值得注意的是,我在文中是只返回了对应的数字,并没有返回匹配的那堆字符串,大家可以试试,怎么才能将匹配的字符串给返回出来。可以试着增加函数的参数,在文中将匹配的字符串保存下来,最后将这一字符串返回出来。代码的可能性是无穷的,大家都可以动手试试。

0 0
原创粉丝点击