2014年Baidu的Interview Question(02)【转载】

源自 清浊决 的博客

2014年百度笔试题之一:

算法和程序设计题:

1 题意:

一幢大楼的底层有1001根电线,这些电线一直延伸到大楼楼顶,你需要确定底层的1001个线头和楼顶的1001次线头的对应关系。你有一个电池,一个灯泡,和许多很短的电线,你需要上下楼几次才能确定电线接头的对应关系:


2 解答:

注明:这里每次上下楼都带着电池和灯泡,以及每次接口连接,对应接口的之前连接过的线都将拆除,所以下面不再说明。

首先将底层一对接口(这里假设为(buttom1,buttom2))连接起来,然后上楼,根据提供的电池和灯泡的亮灭,确定顶层的一对(这里假设为(top1,top2)),接着将顶层的另一对连接起来(假设为(top3,top4)),然后下底层,确定和(top3,top4)对应的一对(假设为(buttom3,buttom4)),然后将底层的 buttom1和buttom3连接,底层的buttom2和buttom4连接,上楼,分别将确定过的两对交换对接,即依次测试(top1,top4),(top2,top3)或者(top1,top3),(top2,top4),直接灯泡亮为止即可确定这四个接口的对接关系。这样第一次确定4个接口需要上下楼3次。

然后根据第一次确定的4个接口,在顶层分别和剩余的接口中的其中四个接口连接,下到底层,和第一次确定四个接口一样,即可确定8个接口。这时确定8根只需要在上面的基础上加1次就可以。接下来就可以确定16个接口,并以此指数增加,从而到2的10次方,即1024,即可全部确定1001个接口,而从2的3次方到2的10次方,共8次.

最后得出第一次确定的3次加上接下来的8次,共需11次即可确定他们的对应关系。

 

********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************

算法和程序设计题:

题意:

长度为N(N很大)的字符,求这个字符串里的最大回文子串。


算法:

注:设字符串数组为str = char[N];

1 定义保存最大回文子串长度n_max,定义临时变量sub_length用于保存每次获取到的回文字串长度;

2 从字符串的开始位置开始移动,直到最后(这里不考虑优化算法)。假设长度为N,i一直递增(i<N),即i++。这里分成三步:

首先:若i=0,则n_max = 1; 否则若i=N-1,则直接返回n_max;否则(即不在头尾),在进入循环判断左右两边字符相等之前,判断str[i]是否等于str[i+1],是则循环条件为str[i+1+n] == str[i-n](n为向左右两边移动的次数,初始化为1),且sub_lenght=(n-1)*2+2,否则循环条件为str[i+n]==str[i-n],且sub_length=(n-1)*2+1。

3 根据2所得到的sub_length值,以之前的n_max比较,若sub_length>n_max,则n_max = sub_length。

4 当移动结束之后,最终即可获得n_max


编程实现:

注:这里不考虑优化算法,只考虑实现过程,在这里只为了测试,故N设了比较小,为20.

  1. #include <stdio.h>   
  2. #include <string.h>   
  3. #define N 20   
  4.   
  5. int getpalindrome(char str[])  
  6. {  
  7.     int n_max = 0;  
  8.     int n = 1;  
  9.     int sub_length=0;  
  10.     int i;  
  11.   
  12.     for(i=0;i<N;i++)  
  13.     {  
  14.         n = 1; //因为最短为1,临时变量   
  15.         if(i==0)  
  16.         {   //判断为字符串起始位置,则n_max赋值为1   
  17.             n = 1;  
  18.             n_max = n;  
  19.         }else if(i == N-1)  
  20.         { //若指针已经移动到最尾,则结束返回   
  21.             return n_max;  
  22.         }else  
  23.         {      //若在中间部分,则在指针p所在的位置往两个方向比较是否有相同的字符,相同则继续,否则一次循环结束   
  24.             if(str[i] == str[i+1])  
  25.             {  
  26.                 while(str[i+1+n] == str[i-n]){  
  27.                     n++;  
  28.                     if((i+1+n) >= N || (i-n)<0){  
  29.                         break;  
  30.                     }  
  31.                 }  
  32.                 sub_length = (n-1)*2 + 2; //一次循环就有2个字符,故有(n-1)*2,再加开始的2个。   
  33.             }else{  
  34.                 while(str[i+n] == str[i-n])  
  35.                 {  
  36.                     n++;  
  37.                     if((i+n)>= N || (i-n)<0){  
  38.                         break;  
  39.                     }  
  40.                 }  
  41.                 sub_length = (n-1)*2 + 1; //一次循环就有2个字符,故有(n-1)*2,再加开始的1个。   
  42.             }  
  43.             if(n_max < sub_length)  
  44.             {  //若得到的值比之前的大,则n_max重新赋值   
  45.                 n_max = sub_length;  
  46.             }  
  47.         }  
  48.     }  
  49.   
  50.     return n_max;  
  51. }  
  52.   
  53. int main(void){  
  54.     char str[N] = {'1','a','b','a','0','1','a','b','c','d','d','c','b','a','1','b','c','d','d','c'};  
  55.     int num = 0;  
  56.     int i;  
  57.   
  58.     num = getpalindrome(str);  
  59.   
  60.     printf("最长为: %d\n",num);  
  61.     return 0;  
  62. }  
#include <stdio.h>
#include <string.h>
#define N 20

int getpalindrome(char str[])
{
	int n_max = 0;
	int n = 1;
	int sub_length=0;
	int i;

	for(i=0;i<N;i++)
	{
		n = 1; //因为最短为1,临时变量
		if(i==0)
		{   //判断为字符串起始位置,则n_max赋值为1
			n = 1;
			n_max = n;
		}else if(i == N-1)
		{ //若指针已经移动到最尾,则结束返回
			return n_max;
		}else
		{      //若在中间部分,则在指针p所在的位置往两个方向比较是否有相同的字符,相同则继续,否则一次循环结束
			if(str[i] == str[i+1])
			{
				while(str[i+1+n] == str[i-n]){
					n++;
					if((i+1+n) >= N || (i-n)<0){
						break;
					}
				}
				sub_length = (n-1)*2 + 2; //一次循环就有2个字符,故有(n-1)*2,再加开始的2个。
			}else{
				while(str[i+n] == str[i-n])
				{
					n++;
					if((i+n)>= N || (i-n)<0){
						break;
					}
				}
				sub_length = (n-1)*2 + 1; //一次循环就有2个字符,故有(n-1)*2,再加开始的1个。
			}
			if(n_max < sub_length)
			{  //若得到的值比之前的大,则n_max重新赋值
				n_max = sub_length;
			}
		}
	}

	return n_max;
}

int main(void){
	char str[N] = {'1','a','b','a','0','1','a','b','c','d','d','c','b','a','1','b','c','d','d','c'};
	int num = 0;
	int i;

	num = getpalindrome(str);

	printf("最长为: %d\n",num);
	return 0;
}
上面的程序输出结果为:

最长为:10

 

************************************************以上均是源自他们博客,仅供求职参考************************************************************************************************
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值