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编码的字母和数字(包括大小写),要求在原字符串上返回结果。#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个节点,则这一个节点,或者两个节点中的任意一个,就是我们要找的根节点。