百度面试题

jsunnygirl 2006-09-17 07:18:43
. (5分)下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位为1)中的大写字母转化为小写字母,请找出其中的bug,注意各种异常情况。
for (char *piterator = szWord; *piterator != 0; piterator++)
{
if (*piterator & 0x80 != 0)
{
piterator++;
}
else if (*piterator >= 'A' && *piterator <= 'Z')
*piterator += 32;
}

2. (5分)对给定的上亿条无序的url,请按照domain、site以及path分别排序,并请指出排序过程中可能会遇到的哪些问题?如何提高效率?
例如:http://www.baidu.com/path/about.html,domain、site以及path的定义分别如下:
Domain:baidu.com
Site:www.baidu.com
Path: www.baidu.com/path

3. (10分)某型CPU的一级数据缓存大小为16K字节,cache块大小为64字节;二级缓存大小为256K字节,cache块大小为4K字节,采用二路组相联。经测试,下面两段代码运行时效率差别很大,请分析哪段代码更好,以及可能的原因。
为了进一步提高效率,你还可以采取什么办法?
A段代码
int matrix[1023][15];
const char *str = "this is a str";
int i, j, tmp, sum = 0;

tmp = strlen(str);
for(i = 0; i < 1023; i++) {
for(j = 0; j < 15; j++) {
sum += matrix[i][j] + tmp;
}
}

B段代码
int matrix[1025][17];
const char *str = "this is a str";
int i, j, sum = 0;

for(i = 0; i < 17; i++) {
for(j = 0; j < 1025; j++) {
sum += matrix[j][i] + strlen(str);
}
}

大家试试:)
...全文
656 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
houdy 2006-09-24
  • 打赏
  • 举报
回复
我在我的BLOG中写了一篇文章详细分析了第一题:
http://blog.csdn.net/houdy/archive/2006/09/24/1271448.aspx
universes 2006-09-20
  • 打赏
  • 举报
回复
mark
gonglifright 2006-09-20
  • 打赏
  • 举报
回复
char的类型取决于编译器,最好用unsigned char
yuhan_0110 2006-09-20
  • 打赏
  • 举报
回复
第二题:

我认为这位仁兄的分析比较合理了:
houdy(致力于图像/图形领域,成为有思想的程序员) ( ) 信誉:96

对于第二题的分析:
1.题目给定的是"上亿条无序的url",第一个感觉就是这么多的数据不可能同时装入到内存中,"External Sorting"是必然的了。第二个感觉就是URL的长度差别很大的,有的很长,有的却很段,选择什么样的数据结构来存放这些数据就需要考虑。定长的数据应该是不合适的,变长的数决是个选择。
2.在domain,site,path中,我们可以先对domain排序,处于同一个domain的URL可以存放在一起,这样他们有类似的数据,例如:XX.baidu.com/XXX。然后我们可以对site进行排序,最后对path进行排序。
yuhan_0110 2006-09-20
  • 打赏
  • 举报
回复
第一题:
for (char *piterator = szWord; *piterator != 0; piterator++)
{
if (*piterator >= 0x80)
{
piterator++;
}
else if (*piterator >= 'A' && *piterator <= 'Z')
{
*piterator += 32;
}
}

00000000
& 10000000
------------
00000000

用位与好像不能实现,因为可能牵扯到补码问题。
yuhan_0110 2006-09-20
  • 打赏
  • 举报
回复
题目是很好,有难度,也有挑战性
tailzhou 2006-09-17
  • 打赏
  • 举报
回复
第3题B有strlen函数的问题,还有一级缓存的命中问题:

我觉得这样的代码应该效率要高那么一点点:

int matrix[1023][15];
const char *str = "this is a str";
int i, j, sum = 0; //tmp变量都可以省掉;

//tmp = strlen(str);
for(i = 0; i < 1023; i++) {
for(j = 0; j < 15; j++) {
sum += matrix[i][j];
}
}

sum += strlen(str)*1023*15; //对tmp的加没必要在循环内,直接用乘法搞定

houdy 2006-09-17
  • 打赏
  • 举报
回复
对于第二题的分析:
1.题目给定的是"上亿条无序的url",第一个感觉就是这么多的数据不可能同时装入到内存中,"External Sorting"是必然的了。第二个感觉就是URL的长度差别很大的,有的很长,有的却很段,选择什么样的数据结构来存放这些数据就需要考虑。定长的数据应该是不合适的,变长的数决是个选择。
2.在domain,site,path中,我们可以先对domain排序,处于同一个domain的URL可以存放在一起,这样他们有类似的数据,例如:XX.baidu.com/XXX。然后我们可以对site进行排序,最后对path进行排序。
xiaoyao888 2006-09-17
  • 打赏
  • 举报
回复
第一题看错,是有优先级的错
for (char *piterator = szWord; *piterator != 0; piterator++)
{
if ((*piterator & 0x80) == 0x80)
{
piterator++;
}
else if (*piterator >= 'A' && *piterator <= 'Z')
{
*piterator += 32;

}

}
houdy 2006-09-17
  • 打赏
  • 举报
回复
我先分析一下第一题的算法:
1.算法的结构就是遍历整个字符串,找出其中的大写的英文字符,然后把这些大写的英文字符转化成小写字符。
2.由于字符串中还存在汉字字符,由于汉字字符占两个字节,所以当我们发现是汉字字符的首个字符时,我们应该跳过紧接着的一个字符,然后继续查询后面的字符。
3.汉字字符的标志时汉字字符的首个字符的最高位是1.
值得注意的是:
1.C/C++语言中的char默认是signed char,取值范围是[0,127],所以如果要比较最高位,我们需要unsigned char,它的取值范围是[0,255].
2.我们只知道汉字字符的第一个字节的特征,我们不知道它的第二个字节的特征,它完全有可能是一个大写英文字母。所以对于上面的代码,我们将指针指向汉字字母的第二个字节后,又试图判断它时候是大写字母,这时候BUG出现了.
暂时我就发现这两个BUG:)

对于第三题,我考虑以下的几个问题:
1.A中用一个变量保存字符串的长度,而B中每次都重复计算字符串的长度。strlen()一般应该有O(n)的时间复杂度,而A中的时间复杂度变成了O(1),虽然多占用了一个变量的空间,我想获得的效率优势是明显的。

2.A中的外循环的次数比内循环的次数多2个数量级(10^2),B中外循环的次数比内循环的次数少2个数量级,虽然我没有理论来支持我的想法,内循环的次数太多,这样就存在频繁的数据移动和交换,效率应该是不好的.

欢迎大家补充:)
tailzhou 2006-09-17
  • 打赏
  • 举报
回复
第一题的错误是优先级的问题:
if (*piterator & 0x80 != 0)
==>
if ((*piterator & 0x80 )!= 0)

SammyLan 2006-09-17
  • 打赏
  • 举报
回复
第三题
A段代码效率高......
xiaoyao888 2006-09-17
  • 打赏
  • 举报
回复
1
for (char *piterator = szWord; *piterator != 0; piterator++)
{
if (*piterator & 0x80 == 0x80)
{
piterator+=2;
}
else if (*piterator >= 'A' && *piterator <= 'Z')
{
*piterator += 32;
piterator++;
}
}

2 等待高人回答

3 当然是第一个快,strlen(str); 可以放在循环外,在循环内用的话开销会很大
提高效率的话这样如何
int tal=1023*15
for(i = 0; i < tal; i++,sum += *((int*)matrix+i) + tmp) ;

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧