几个算法题目

算法题(说明:这些题就不是什么花样了,考的是你的基础知识怎么样。再聪明而没有实学的人都将会被这些题所淘汰。)
1.链表和数组的区别在哪里? 
2.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法? 
3.编写实现数组排序的一种算法。说明为什么你会选择用这样的方法? 
4.请编写能直接实现strstr()函数功能的代码。 
5.编写反转字符串的程序,要求优化速度、优化空间。 
6.在链表里如何发现循环链接? 
7.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。 
8.写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?) 
9.给出一个函数来输出一个字符串的所有排列。 
10.请编写实现malloc()内存分配函数功能一样的代码。 
11.给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。 
12.怎样编写一个程序,把一个有序整数数组放到二叉树中? 
13.怎样从顶部开始逐层打印二叉树结点数据?请编程。 
14.怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?

 

给一个字符串、例如 “ababc”要求返回“ab”因为“ab”连续重复出现且最长。  C/C++语言写一函数完成该算法,给出复杂度

 

int totalLen;
totalLen = strlen(str);    //
取得整个字符串的长度。

int index;                 //从左到右扫描到的索引值.

char * tmpstr;            //用来保存临时的连续重复出现的字符串.

int startIndex = 0;
int maxlen = 0;
char *maxstr;            //
保存最长的连续重复出现的字符串.

/*

先从最左的开始,一个一个字符地扫描,设扫到的indexindex.

在扫描到的字符及其右边的所有字符里查找最长的连续出现的字符串.

具体方法是:

1.取得这些字符串的长度,除以2,得到可能的重复字符串的最长长度.

2. 判断substr(index,index+len)substr(index+len,index+len+len)是不是一样,是的话返回substr(index,index+len);

3.不是则len-1,重复第2步直到len = 0;

4.index 加一,重复第1.

例如有"cababc",:

totalLen = 6;index = 0;

现在从左开始

index = 0 ,"cababc"里找,len = totalLen/2 = 3;

1.cab != abc len --;

2.ca != ba len --;

3.c != a len --;

index ++; 则现在在"ababc"里查找

ab == ab 返回"ab",保存在tmpstrmaxstr

index ++ ;则现在在"baba"里查找

...

...

找不到...

若是以后查到也有连续出现的字符串,则先保存在tmpstr,然后长度与maxstr的长度比较,若是长度大于maxstr,maxstr = tmpstr;

返回maxstr即可.

 

 

char * GetRepeatLongestSuhStr(char * str)

{

   int index, startIndex, i;

   int sublen, totalLen, maxlen;

   char *tmpstr, *maxstr;

 

   startIndex=0;

   totalLen=strlen(str);

   maxlen = 0;

 

   for(index=0; index<totalLen; index++)

   {

     sublen = (totalLen - index)/2;

     printf("/tsublen=%d",sublen);

     for( ;sublen > 0 ;sublen --)

     {

         int tmp = 0;

         while((str[index + tmp] == str[index+sublen+tmp]) && (tmp < sublen))

             tmp++;

         if(tmp > 0)

           if(tmp > maxlen)

           {

             maxlen = tmp;

             startIndex = index;

           }

     }

   }

   if(maxlen > 0 )

   {

     maxstr =(char *)malloc(maxlen+1);

     for(i = 0 ;i < maxlen ;i ++)

        maxstr[i] = str[startIndex+i];

     maxstr[maxlen] = '/0';

     return maxstr;

   }

   return NULL;

}

 

void main()

{

   char * tmp = "eabcdabcdb";

   char * str = GetRepeatLongestSuhStr(tmp);

   printf("/t%s/n",str);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值