Chinaunix首页 | 论坛 | 博客
  • 博客访问: 772711
  • 博文数量: 230
  • 博客积分: 6330
  • 博客等级: 准将
  • 技术积分: 2188
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-10 15:55
个人简介

脚踏实地

文章分类

全部博文(230)

文章存档

2017年(1)

2016年(7)

2015年(10)

2014年(32)

2013年(24)

2012年(33)

2011年(50)

2010年(30)

2009年(43)

分类: C/C++

2009-11-17 23:10:15

(说明:这些题就不是什么花样了,考的是你的基础知识怎么样。再聪明而没有实学的人都将会被这些题所淘汰。)
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;            //保存最长的连续重复出现的字符串.
/*
先从最左的开始,一个一个字符地扫描,设扫到的index为index.
在扫描到的字符及其右边的所有字符里查找最长的连续出现的字符串.
具体方法是:
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",保存在tmpstr和maxstr里
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
   {
     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);
}
发表于 @ 2007年07月31日 15:25:00 | 评论( 2 ) | 编辑| 举报| 收藏
旧一篇: 一道很难的有关算法的测试题,写逆算法 | 新一篇: C/C++ 笔试、面试题目大汇总 BambooFamily 发表于2008年9月26日 10:59:51  IP:举报删除
看看!tiansq 发表于2008年9月30日 19:08:34  IP:举报删除
博主,我看过你的算法,觉得里面有个bug,若
tmp="abacd",这个程序的运行结果是'a'。
改进:在GetRepeatLongestSuhStr函数中,
if(tmp > 0)
if(tmp > maxlen)
{
maxlen = tmp;
startIndex = index;
}
改为 if(tmp == sublen)
if(tmp > maxlen)
{
maxlen = tmp;
startIndex = index;
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sendy888/archive/2007/07/31/1719308.aspx
阅读(807) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~