Skip to content

Commit 9582d08

Browse files
authored
Create (数学问题、数组操作)717、1比特与2比特字符
1 parent dad5716 commit 9582d08

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
有两种特殊字符。第一种字符可以用一比特0来表示。第二种字符可以用两比特(10 或 11)来表示。
3+
4+
现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。
5+
6+
示例 1:
7+
8+
输入:
9+
bits = [1, 0, 0]
10+
输出: True
11+
解释:
12+
唯一的编码方式是一个两比特字符和一个一比特字符。所以最后一个字符是一比特字符。
13+
14+
示例 2:
15+
16+
输入:
17+
bits = [1, 1, 1, 0]
18+
输出: False
19+
解释:
20+
唯一的编码方式是两比特字符和两比特字符。所以最后一个字符不是一比特字符。
21+
22+
注意:
23+
24+
1 <= len(bits) <= 1000.
25+
bits[i] 总是0 或 1.
26+
*/
27+
28+
bool isOneBitCharacter(int* bits, int bitsSize)
29+
{
30+
if(bitsSize == 1 && bits[0] == 0)
31+
return true;
32+
if(bits[bitsSize-1] == 1)
33+
return false;
34+
else
35+
{
36+
if(bits[bitsSize-2] == 0)
37+
return true;
38+
else
39+
{
40+
int cnt = 0;
41+
int i = 0;
42+
while(bitsSize - 2 - i >= 0)
43+
{
44+
if(bits[bitsSize-2-i] == 1)
45+
cnt++;
46+
else
47+
break;
48+
i++;
49+
}
50+
51+
if(cnt % 2 == 0)
52+
return true;
53+
else
54+
return false;
55+
}
56+
}
57+
}
58+
59+
/*
60+
依据编码规则,对编码字符串归纳如下:
61+
1、检查最后一位,如果是1,直接return False,如果是0,检查倒数第二位;
62+
2、倒数第二位是0 return True。
63+
3、倒数第二位不是0,检查0前有几个连续1,奇数个:False, 偶数个:True。
64+
*/
65+
66+
bool isOneBitCharacter(int* bits, int bitsSize)
67+
{
68+
if(bitsSize == 1)
69+
return true;
70+
int i = 0;
71+
while(i < bitsSize - 1)
72+
{
73+
if(bits[i] == 0)
74+
i++;
75+
else if(bits[i] == 1)
76+
i = i + 2;
77+
}
78+
if(i == bitsSize)
79+
return false;
80+
return true;
81+
}
82+
83+
/*
84+
1、最后一位为0才可能正确。
85+
2、排除1,如果只有一个数,则对。
86+
3、排除1、2,从头数,由于1后面必须接0或1,所以遇到1则跳一位。
87+
如果能够跳到bitsSize-1,则说明符合,否则错误。
88+
*/

0 commit comments

Comments
 (0)