每天一道面试题,为今年找工作早做准备!笨鸟先飞,哈哈(2012年4月篇)

 

1、百度面试题:用C语言将输入的字符串在原串上倒序

用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。

void revert(char* str) {
    char c;
    for (int front = 0, int back = strlen(str) - 1; front < back;++front, --back) {
      c = str[back];
      str[back] = str[front];
      str[front] = c;
    } 
 }


 

2、百度面试题:删除所有ascii编码的字符和数字

    已知一个字串由GBK汉字和ascii编码的数字和字母混合组成,编写c语言函数实现从中去掉所有ascii编码的字母和数字(包括大小写),要求在原字符串上返回结果。
    例如: “http://hi.baidu.com/mianshiti 是讨论IT面试题的博客” 会变成 “://../ 是讨论面试题的博客”。
    注:函数接口为:int filter_ascii(char* gbk);汉字的GBK编码范围是0x8140-0xFEFE。(一个汉字算两个字符)

#include<stdio.h>
#include<string.h>
int filter_ascii(char* gbk){
	char c;
	for(int i=0;i<strlen(gbk);){
	c=gbk[i];
	if(c>='a' && c<='z' ||c>='A' && c<='Z' ||c>='0' &&c<='9'){i++;}
	else if(c>=128 && c<=254){
		printf("%c",c+gbk[i+1]);
		i=i+2;
	}
	else{
		printf("%c",c);
		i=i+1;
	}
	}
	return 0;
}
int main(){
	char* str="http://hi.baidu.com/mianshiti 是讨论IT面试题的博客";
	filter_ascii(str);
	printf("\n");
}

 

3、网易面试题:警察小偷,爸爸儿子,妈妈女儿该如何过河

一个警察,一个小偷,一个爸爸,一个妈妈,两个儿子,两个女儿,共八个人要过一条河,河上没有桥,只有一条船。
有几个条件必须满足:
1、船一次最多只能坐两个人
2、小偷必须和警察在一起,否则小偷会偷东西
3、爸爸必须和儿子在一起否则妈妈会打儿子
4、妈妈必须和女儿在一起否则爸爸会打女儿
5、只有警察,爸爸,妈妈会划船
现在要他们八个都安全过河,请提出方案。
    妈妈和女儿过去,妈妈回来;
   妈妈和女儿过去,妈妈回来;
   妈妈和爸爸过去,爸爸回来;
   警察和小偷过去,妈妈回来;
   妈妈和爸爸过去,爸爸回来;
   爸爸和儿子过去,警察和小偷回来;
   警察和儿子过去,警察回来;
   警察和小偷过去。

4、百度面试题:判断url的类型
编写一个C语言函数,要求输入一个url,输出该url是首页、目录页或者其他url
如下形式叫做首页:
militia.info/
www.apcnc.com.cn/
http://www.cyjzs.comwww.greena888.com/
如下形式叫做目录页:
http://hi.baidu.com/mianshiti/
thursdaythree.net/greenhouses--gas-global-green-house-warming/

请注意:
a) url有可能带http头也有可能不带
b)动态url(即含有"?"的url)的一律不算目录页,如:
www.buddhismcity.net/utility/mailit.php?l=/activity/details/3135/
www.buddhismcity.net/utility/mailit.php?l=/activity/details/2449/

 分析:从后往前,除了最后一个“/”,只要出现“?”就是其他页,若出现“/”且它的下一个字符不是“/”,这个页面就是目录页,其他都是主页(还要考虑一个“/”都没有的情况)。

#include<stdio.h>
#include<string.h>
int main(){
char *str[7]={"militia.info/","http://www.cyjzs.comwww.greena888.com/","www.apcnc.com.cn/","http://hi.baidu.com/mianshiti/","thursdaythree.net/greenhouses--gas-global-green-house-warming/","www.buddhismcity.net/utility/mailit.php?l=/activity/details/3135/","www.buddhismcity.net/utility/mailit.php?l=/activity/details/2449/"};
int _flag,_no,_other;
int i,j;
int length;
for(i=0;i<7;i++){
	_flag=0;
	_no=0;
	_other=0;
	length=strlen(str[i]);
	for(j=length-2;j>=0 && _other==0;j--)
	{
		if(str[i][j]=='?') {
			_other=-1;
		} 
		else if (str[i][j]=='/' &&  _flag==0){
			_no=1;
			if(str[i][j-1]=='/') _flag=2;
			else _flag=1;;//
		
		}

	}
	printf("%s\t",str[i]);
	if(_other==-1) printf("其他页\n"); 
	else if(_no==0||_flag==2) printf("主页\n");
	else if(_flag==1) printf("目录页\n"); 
	else printf("ERROR\n") ;
}
}



 


闲来无事,试了用正则表达式写判断主页(判断目录页的写的不对,今天木有时间,改天再写):

grep -E "((^http://)|(^[a-zA-Z]))([^/])+(/$)" baidu-test1
以http://开头或者以字母开头,中间不能出现多余的/,并且以/收尾。

 

5、【12年腾讯实习生招聘】 

已知数组a[n],求数组b[n].

要求:b[i]=a[0]*a[1]*……*a[n-1]/a[i],不能用除法。

a.时间复杂度O(n),空间复杂度O(1)。

b.除了迭代器i,不允许使用任何其它变量(包括栈临时变量等)。      

分析:思路是前累加,后累加,然后相乘。

#include<stdio.h>
const int n=10;
void accumulation_n2(int a[n]){
	int sum=1;
	int b[n];
	int i,j,k;
	for(i=0;i<n;i++) sum=sum*a[i];
	for(i=0;i<n;i++) b[i]=sum/a[i];
	for(i=0;i<n;i++){
		printf("%d ",b[i]);
	}
}
void accumulation_n(int a[n]){
	int b[n];
	b[n-1]=1;
	int i;
	for(i=n-2;i>=0;i--){
		b[i]=b[i+1]*a[i+1];
	}//后乘
	for(i=1;i<n;i++){
		a[i]=a[i]*a[i-1];
	} //前乘 (包括了a[i])
	printf("%d ",b[0]);
	for(i=1;i<n;i++){
		b[i]=a[i-1]*b[i];
		printf("%d ",b[i]);
	}

}
int main(){
	int a[n];
	int j;
	for(j=0;j<n;j++) {
		a[j]=j+1;}
	accumulation_n2(a);
	printf("\n");
	accumulation_n(a);
}


 6、谷歌面试题:将无向无环连通图转换成深度最小的树

已知一个无向无环连通图T的所有顶点和边的信息,现需要将其转换为一棵树,要求树的深度最小,请设计一个算法找到所有满足要求的树的根结点,并分析时空复杂度。

树的深度取决于根节点到最深叶节点的距离,所以我们可以从叶节点入手。
叶节点会且只会和某一个节点连通(反之不成立,因为根节点也可能只和一个节点连通),所以我们很容易找到所有可能的叶节点。
题目可以等价于找到了两个叶节点,使得两个叶节点之间的距离最远。根节点就是这两个叶节点路径的中间点(或者中间两个点的任意一个)。我们可以每次都将连接度为1的节点删掉,直到最后只剩下1个或2个节点,则这一个节点,或者两个节点中的任意一个,就是我们要找的根节点。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值