百度面试06年
来源:互联网 发布:军工路招聘淘宝仓管 编辑:程序博客网 时间:2024/04/29 23:25
下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位为1)中的大写字母转化为小写字母,请找出其中的bug,注意各种异常情况。
{
if (*piterator&0x80!=0) {
piterator++;
}else if (*piterator>='A'&&*piterator<='Z') {
*piterator+=32;
}
对于这个问题,我首先分析一下题目本身:
1.算法的基本思路比较清晰:遍历整个字符串,找出其中的大写的英文字符,然后把这些大写的英文字符转化成小写字符。
2.当字符串中某个字节的最高位是1,则这个字节和后面紧接着的一个字节组成了一个汉字字符。
3.对于字符串中占两个字节的汉字字符,我们应该跳过这个汉字字符,继续搜寻后面的字符。
有了这样的一个基本认识,我接着又考虑了一些细节的问题:
Q1:对于这样的字符串,我们用什么数据类型来保存其中的每个字节?
我们知道,ASCII编码的字符可以用signed char来保存,因为ASCII编码的字符的取值范围在[0,127],正好和signed char所能表示的正整数吻合。如果超出了这个范围,signed char就会溢出。本题的字符串中包含大于这个范围的值(字节的最高位是1),所以用signed char就不合适了,这时候就应该考虑unsigned char。
Q2:对于这样的字符串,我们用什么方式来表示字符串的结束?
我们知道,对于用ASCII编码的字符串,我们用'\0'字符来表示字符串的结束。对于本题中的字符串,该怎样表示字符串的结束?我也不能确定,暂时还用'\0'来表示吧。
Q3:对于汉字字符,它占两个字节,第一个字节的最高位是1,那第二个字节有什么特征?
从题目中看不出来有什么特征。所体它可能是'\0',也可能是ACSII编码的字符,也可能是其他字符。
好了,有了以上理论上的分析,我在原来代码的基础上写一个修改的版本:
{
if ((*piterator >= 'A') && (*piterator <= 'Z')) {
//if the character is uppercase character
*piterator += 32;
}else if ((*piterator & 0x80)){
//if the character is the first character of chinese character
if (*(piterator+1) == '\0') {
//if the second character is null character
}else {
++piterator;
}
}
}
代码的分析:
1.我使用unsigned char来替换char。
2.对于汉字字符,我们只知道它的第一个字符的特征,我们却不知道第二个字符的特征,这样就存在一些特殊的情况:
2.1 汉字的第二个字符是'\0'。我们有可能把这个字符看作是整个字符串的结束字符,也就是字符串的最后的一个字符。这时候如果我们试图跳过这个字符去获取它后面的字符,就会发生字符串的"越界"错误。为了避免这样的错误,如果汉字的第二个字符是'\0',就不跳过这个字符。
2.2 汉字的第二个字符是英文的大写字母。在原先的代码中如果检测到某个字符是汉字字符的第一个字符,会将指针调整到这个汉字字符的第二个字节,接着又判断这个字节是否是大写字母,这时候就有可能将这个字符看作是大写字母,这样就发生了错误。为了避免这样的错误,我将判断是否是大小字母的代码放到前面。
3.另外的一个错误就是,由于"!="的优先级大于"&"的优先级,原先的代码:
被编译器解析成:
这样出来的结果就是错误的。为了避免这样的错误,我删除了"不等于0"的比较。
- 百度面试06年
- 09年的百度面试
- 百度面试总结(2008年)
- 百度面试
- 百度面试
- 百度面试
- 百度面试
- 百度面试
- 百度面试
- 百度面试
- 百度面试
- 百度面试
- 百度面试
- 百度面试
- 百度面试
- 百度面试
- 百度面试
- 百度面试
- 送给“苦逼”的IT人系列2:要事第一,关于人生计划以及时间管理 .
- 正则表达式测试
- sencha2中建立复杂Model
- Dll注入经典方法完整版
- 送给“苦逼”的IT人系列3:多久跳一次槽?用一个朋友的例子告诉你,为什么你没有圈子。 .
- 百度面试06年
- struts验证码
- android emulator启动的两种方法详解
- 10亿美元(顺势而动,抓住机遇。)
- 获得上次访问时间
- nRF24L01无线模块使用1---电平转换
- 内存分配——深入浅出
- 教你怎么煲耳机 让声音更美妙!
- poj 百练(2735)基础题