CSP-J 2021 第17题


 

                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个合成一个。

 

  1. 输出的第二行一定是由小写字母、大写字母、数字和 +、 /、=构成的字符串。(X )
    table[]数组下标有效的范围是‘A’~'Z','a'~'z','0'~'9','+','/','=',值是0~63。
    这个范围经过decode函数中的各种位运算后不一定还是这个范围了。

  2. 可能存在输入不同,但输出的第二行相同的情形。(√ )
    只有输入的是‘A’~'Z','a'~'z','0'~'9','+','/','=',table数组的内容才会是0~36,如果输入其它字符时,table[]数组的值一律为0xff,因此输出很有可能相同。

  3. 输出的第一行为 -1。( )
    table[]数组中存在有效值的下标范围就是‘A’~'Z','a'~'z','0'~'9','+','/','='的ASCII码的范围,这之中没有0,所以table[0]存放的是0xff,转为二进制(字符是8位二进制表示)就是1111 1111,转为int类型的话是负数的补码形式,先转为反码1111 1110,再转为原码1000 0001,也就是十进制的-1

单选题

  1. 设输入字符串长度为 n,decode 函数的时间复杂度为(B )
    A. O(根号n​)
    B. O(n)
    C. O(nlogn)
    D. O(n2)
    只有一个循环,因此选B

  2. 当输入为 Y3Nx 时,输出的第二行为(B)。
     A. csp

     B. csq
     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. (3.5 分)当输入为 Y2NmIDIwMjE=时,输出的第二行为( C)。
    A. ccf2021

     B. ccf2022
     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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值