由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 一道google的面试题.
相关主题
关于判断一个字符串是否是一个合法的utf-8串问个结构体的大小问题
讨论:这个题怎么解一道google面经题
一道面试题,请大家给些意见请教电面试题
这个G题是DFS还是DP面试题
请教一道老题目微软面试题
几道微软面试题问个bit struct的面试题 急
问道面试题面试题palindrome
怎么把 integer 转为 multi-byte integer format? (转载)一道面试题(integer to binary string)
相关话题的讨论汇总
话题: 字节话题: byte话题: encode话题: bit话题: 0x80
进入JobHunting版参与讨论
1 (共1页)
z***b
发帖数: 127
1
一种encoding只有1 byte encode或者两byte encode两种形式,如果说第一byte的第一
个bit是0,那么这个bit开始的这个byte encode一个字符;如果第一个byte的第一位是
1,那么他一定是两个byte encode一个字符,并且他的第二个byte的首bit可以是1或者
0. 题目要求,给你一串encode,请问最后一个字符是一个byte encode的还是两个byte
encode的。不允许顺序parse bit串。
这题的考点是啥啊?
x*****n
发帖数: 195
2
逆序扫描bytes的首bit就可以吧?
0,0 -》 one byte
0,1 -》 Not valid
1,0 -》 都有可能,继续往前扫描
1,1 -》 two bytes

byte

【在 z***b 的大作中提到】
: 一种encoding只有1 byte encode或者两byte encode两种形式,如果说第一byte的第一
: 个bit是0,那么这个bit开始的这个byte encode一个字符;如果第一个byte的第一位是
: 1,那么他一定是两个byte encode一个字符,并且他的第二个byte的首bit可以是1或者
: 0. 题目要求,给你一串encode,请问最后一个字符是一个byte encode的还是两个byte
: encode的。不允许顺序parse bit串。
: 这题的考点是啥啊?

c*******e
发帖数: 373
3
// 末字节high bit为1,是非法单字节编码,所以必然是双字节编码
if (lastByte & 0x80 != 0) return DoubleByteEncoding;
// 末第二字节high bit为0,不带末字节混,所以末字节肯定是单字节编码
if (last2ndByte & 0x80 == 0) return SingleByteEncoding;
// 末字节high bit为0,末二字节high bit为1的情况,不能确定,需要检查末第三
if (last3rdByte & 0x80 == 0)
return DoubleByteEncoding; // 末第3个高位0,不带末第2混,所以倒数2和1是
双字节码
if (last4thByte & 0x80 == 0) //末4不带末3混,末3和末2组成双字节,最末一个单了
return SingleByteEncoding;
到此为止,不用再继续推理了,可以总结规律了:
if (n == 1) return 1;
// 末高位1,必然是双字节编码
if (bytes[n-1] & 0x80 != 0) return 2;
// 末高位0,需要倒着扫描
else {
for (int i = n - 2; i --; i >= 0) {
// 看到0,就可以确定答案了,因为0必然是一个编码序列的结尾,后面是11...
110
// n - 1 - i是这个11...110的串的长度,如果是奇数,那么末字节单溜
if (bytes[i] & 0x80 == 0)
return 2 - (n - 1 - i) % 2;
// 到了第1个字节,并且高位是1,那么11...110串的长度是n - i,包括当前字节
if (i == 0)
return 2 - (n - i) % 2;
// else, 当前是字节高位是1,继续倒扫,直到看到0,或者扫描完
}
}
k******a
发帖数: 44
4
最后一个字节不是单就是双。
如果倒数第二个字节的高位是0,那么最后一个字节一定是单
如果倒数第三个字节的高位是1,那么最后一个字节一定是单
否则为双。
考点是逻辑关系吧?
z***b
发帖数: 127
5
这位的分析好厉害啊,佩服!!

单了

【在 c*******e 的大作中提到】
: // 末字节high bit为1,是非法单字节编码,所以必然是双字节编码
: if (lastByte & 0x80 != 0) return DoubleByteEncoding;
: // 末第二字节high bit为0,不带末字节混,所以末字节肯定是单字节编码
: if (last2ndByte & 0x80 == 0) return SingleByteEncoding;
: // 末字节high bit为0,末二字节high bit为1的情况,不能确定,需要检查末第三
: if (last3rdByte & 0x80 == 0)
: return DoubleByteEncoding; // 末第3个高位0,不带末第2混,所以倒数2和1是
: 双字节码
: if (last4thByte & 0x80 == 0) //末4不带末3混,末3和末2组成双字节,最末一个单了
: return SingleByteEncoding;

q****o
发帖数: 6
6
是啊,神分析~

【在 z***b 的大作中提到】
: 这位的分析好厉害啊,佩服!!
:
: 单了

1 (共1页)
进入JobHunting版参与讨论
相关主题
一道面试题(integer to binary string)请教一道老题目
看到一个c的面试题,求教。几道微软面试题
一道G的面试题。问道面试题
请问一道面试题怎么把 integer 转为 multi-byte integer format? (转载)
关于判断一个字符串是否是一个合法的utf-8串问个结构体的大小问题
讨论:这个题怎么解一道google面经题
一道面试题,请大家给些意见请教电面试题
这个G题是DFS还是DP面试题
相关话题的讨论汇总
话题: 字节话题: byte话题: encode话题: bit话题: 0x80