base数组
0 A | 1 B | 2 C | 3 D | 4 E | 5 F | 6 G | 7 H | 8 I | 9 J | 10 K | 11 L | 12 M |
13 N | 14 0 | 15 P | 16 Q | 17 R | 18 S | 19 T | 20 U | 21 V | 22 W | 23 X | 24 Y | 25 Z |
26 a | 27 b | 28 c | 29 d | 30 e | 31 f | 32 g | 33 h | 34 i | 35 j | 36 k | 37 l | 38 m |
39 n | 40 o | 41 p | 42 q | 43 r | 44 s | 45 t | 46 u | 47 v | 48 w | 49 x | 50 y | 51 z |
52 '0' | 53 '1' | 54 '2' | 55 '3' | 56 '4' | 57 '5' | 58 '6' | 59 '7' | 60 '8' | 61 '9' | 62 '+' | 63 '-' |
table数组是从0~255;
i=0时,table[base[0]]=0,即table['A']=0
I=1时,table[base[1]]=1,即table['B']=1
......
table数组相当于将base数组的下标和内容反过来。
22~31行:decode()函数中每四个字符一组,转为三个字符。第0个字符和第1个字符合成一个字符,第1个和第2个字符合成一个,第2个和第3个合成一个。
-
输出的第二行一定是由小写字母、大写字母、数字和 +、 /、=构成的字符串。(X )
table[]数组下标有效的范围是‘A’~'Z','a'~'z','0'~'9','+','/','=',值是0~63。
这个范围经过decode函数中的各种位运算后不一定还是这个范围了。 -
可能存在输入不同,但输出的第二行相同的情形。(√ )
只有输入的是‘A’~'Z','a'~'z','0'~'9','+','/','=',table数组的内容才会是0~36,如果输入其它字符时,table[]数组的值一律为0xff,因此输出很有可能相同。 -
输出的第一行为 -1。( )
table[]数组中存在有效值的下标范围就是‘A’~'Z','a'~'z','0'~'9','+','/','='的ASCII码的范围,这之中没有0,所以table[0]存放的是0xff,转为二进制(字符是8位二进制表示)就是1111 1111,转为int类型的话是负数的补码形式,先转为反码1111 1110,再转为原码1000 0001,也就是十进制的-1
单选题
-
设输入字符串长度为 n,
decode
函数的时间复杂度为(B )
A. O(根号n)
B. O(n)
C. O(nlogn)
D. O(n2)
只有一个循环,因此选B -
当输入为 Y3Nx 时,输出的第二行为(B)。
B. csq
A.csp
C. CSP
D. Csp
第一个字母:table['Y']<<2 | table['3']>>4
24<<2 | 55>>4
0001 1000<<2 | 0011 0111>>4
0110 0000 | 0000 0011
结果为0110 0011 = 99 ,‘c’的ASCII码是99,所以第一个字母为‘c’。
第二个字母:(table['3']&0x0f)<<4 | table['N']>>2
(55&0000 1111)<<4 | 13>>2
(0011 0111 & 0000 1111)<<4 | 0000 1101>>2
0000 0111<<4 | 0000 1101>>2
0111 0000 | 0000 0011
结果为0111 0011 = 115 ,‘s’的ASCII码是115,所以第二个字母为‘s’。
第三个字母:table['N']<<6 | table['x']
13<<6 | 49
0000 1101 << 6 | 0011 0001
0100 0000 | 0011 0001
结果为0111 0001 = 113 ,‘q’的ASCII码是113,所以第二个字母为‘q’。
综上转为了csq -
(3.5 分)当输入为 Y2NmIDIwMjE=时,输出的第二行为( C)。
B. ccf2022
A.ccf2021
C. ccf 2021
D. ccf 2022
decode()是每四个一组转为新的字符,当没有‘=’时,4个转3个;有一个‘=’时,4个转2个。
所以Y2Nm IDIw MjE= 会转为3 + 3 + 2 = 8个字符,排除AB选项(因为只有7个字符)。
C和D选项区别在于最后一组“MjE=”是转为21还是22。
第二个字母:(table['j'] & 0xff)<<4 | table['E']>>2
(35 & 0000 1111)<<4 | 4>>2
(0010 0011&0000 1111)<<4 | 0000 0100>>2
0000 0011<<4 | 0000 0001
0011 0000 | 0000 0001
结果为0011 0001 = 49 ,‘1’的ASCII码是49,所以最后一位是1,选C