林老师 · 客观题题库 · 专题 07 数组与字符串 · 复习强化

专题 07 数组与字符串 · 复习强化

100 题 · 每题对应一个知识细节 · 全部原创
真题
复刻
试卷编号ORIG-专题07数组与字符串-复习强化
题目总数113 题 · 100 分
试卷类型客观题
考生须知:
① 本卷共 9 大部分,合计 113 题 · 100 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 100 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

一维数组基础

13 QUESTIONS · 2 POINTS EACH
第 1 题 A1 未作答

int a[5] = {10, 20, 30, 40, 50};,则 a[1] 的值是( )。

(1 分)
第 2 题 A2 未作答

阅读程序:

01int a[5] = {1, 2, 3};
02cout << a[3];

程序的输出是( )。

(1 分)
第 3 题 A3 未作答

在函数内声明 int a[100];不做任何初始化就立刻输出 a[0],结果是( )。

(1 分)
第 4 题 A4 未作答

int a[10];,程序中访问 a[10]。下列说法正确的是( )。

(1 分)
第 5 题 A5 未作答

数组 int a[N] 合法的下标范围是( )。

(1 分)
第 6 题 A6 未作答

阅读程序:

01int a[6] = {1, 2, 3, 4, 5, 6};
02int s = 0;
03for (int i = 0; i < 6; ++i)
04    s += a[i];
05cout << s;

程序的输出是( )。

(1 分)
第 7 题 A7 未作答

数组 a = {5, 9, 2, 9, 7}(下标从 00 起)。下面的程序执行后 mx 是( )。

01int mx = a[0];
02for (int i = 1; i < 5; ++i)
03    if (a[i] > mx) mx = a[i];

(1 分)
第 8 题 A8 未作答

求数组最大值时把 mx 初始化为 00(而不是 a[0])。当数组所有元素都是负数(如 -3, -1, -7)时,结果是( )。

(1 分)
第 9 题 A9 未作答

阅读程序:

01int a[5] = {4, 0, 3, 1, 2};
02cout << a[a[0]];

程序的输出是( )。

(1 分)
第 10 题 A10 未作答

全局声明 int g[100];(在所有函数之外),未写初始化。g[50] 的值是( )。

(1 分)
第 11 题 A11 未作答

关于 int a[n];n 是运行时读入的变量),正确的说法是( )。

(1 分)
第 12 题 A12 未作答

int a[8];main 函数内,sizeof(a) / sizeof(a[0]) 的值是( )。

(1 分)
第 13 题 A13 未作答

阅读程序:

01void f(int b[]) {
02    cout << sizeof(b);
03}
04int main() {
05    int a[10];
06    cout << sizeof(a) << " ";
07    f(a);
08}

int44 字节、指针占 88 字节的机器上,输出是( )。

(1 分)

数组操作惯用法

14 QUESTIONS · 2 POINTS EACH
第 14 题 B1 未作答

阅读程序:

01int a[4] = {1, 2, 3, 4};
02for (int i = 3; i >= 0; --i)
03    cout << a[i] << " ";

程序的输出是( )。

(1 分)
第 15 题 B2 未作答

把数组 a = {1, 2, 3, 4, 5} 原地反转(不用新数组)的写法是( )。

(1 分)
第 16 题 B3 未作答

有序数组 a = {2, 4, 6, 8, 10}(长度 n=5n=5),要删除下标 11 处的元素,应把( )。

(1 分)
第 17 题 B4 未作答

在长度为 nn 的数组下标 pp 处插入新元素 x(保持其余相对次序),正确的操作顺序是( )。

(1 分)
第 18 题 B5 未作答

有序数组 a = {1, 1, 2, 3, 3, 3, 5}n=7n=7)。用"保留段 + 双下标"去重:b[0]=a[0],对每个 a[i],若它与 b 的最后一个保留元素不同则存入 b。去重后 b 的长度是( )。

(1 分)
第 19 题 B6 未作答

把升序数组 a = {1, 4, 6}b = {2, 3, 5} 合并成升序数组 c(长度 66)。合并后 c 是( )。

(1 分)
第 20 题 B7 未作答

n=5n = 5 个人围成圈,下标 040 \sim 4。程序里从当前下标 i 前进一步(到下一个人)的写法是( )。

(1 分)
第 21 题 B8 未作答

模拟约瑟夫问题时用 bool out[N] 记录每个人是否已出圈,这种"下标即编号、值为真假"的数组称为标记数组。判断某人还在圈内的条件是( )。

(1 分)
第 22 题 B9 未作答

阅读程序:

01int a[8] = {3, 1, 3, 2, 1, 3, 2, 1};
02int cnt[4] = {0, 0, 0, 0};
03for (int i = 0; i < 8; ++i)
04    cnt[a[i]]++;
05cout << cnt[3];

程序的输出是( )。

(1 分)
第 23 题 B10 未作答

cnt 数组按桶下标从小到大输出(值 v 重复 cnt[v] 次),即可把原数组排序。数组 {2, 0, 2, 0, 1}(值域 020 \sim 2)按此方法输出的序列是( )。

(1 分)
第 24 题 B11 未作答

阅读程序:

01int a[5] = {5, 9, 2, 9, 7};
02int mx = a[0], pos = 0;
03for (int i = 1; i < 5; ++i)
04    if (a[i] > mx) { mx = a[i]; pos = i; }
05cout << pos;

程序的输出是( )(数组有两个 99)。

(1 分)
第 25 题 B12 未作答

不借助 swap 函数,交换 a[i]a[j] 的正确三步是( )。

(1 分)
第 26 题 B13 未作答

用一个数组和下标变量就能实现栈或队列:数组作存储区,下标变量指示操作位置。下列对应关系正确的是( )。

(1 分)
第 27 题 B14 未作答

阅读程序:

01int a[5] = {2, 0, 3, 1, 2};
02int p[4];
03for (int i = 0; i < 5; ++i)
04    p[a[i]] = i;
05cout << p[2];

程序的输出是( )。

(1 分)

二维数组

12 QUESTIONS · 2 POINTS EACH
第 28 题 C1 未作答

int g[3][4]; 定义的二维数组,正确的理解是( )。

(1 分)
第 29 题 C2 未作答

阅读程序:

01int g[2][3] = {{1, 2}, {4}};
02cout << g[0][2] << " " << g[1][1];

程序的输出是( )。

(1 分)
第 30 题 C3 未作答

01for (int i = 0; i < 2; ++i)
02    for (int j = 0; j < 3; ++j)
03        cout << g[i][j] << " ";

g = {{1,2,3},{4,5,6}},输出是( )。

(1 分)
第 31 题 C4 未作答

二维数组在内存里按行优先连续存放:g[0][0], g[0][1], g[0][2], g[1][0], ...。因此紧跟在 g[0][2] 后面的元素是( )。

(1 分)
第 32 题 C5 未作答

int g[5][7];,数组元素的总个数是( )。

(1 分)
第 33 题 C6 未作答

3×33 \times 3 矩阵 g = {{1,2,3},{4,5,6},{7,8,9}},转置后(行列互换)g[1][2] 位置的值是( )。

(1 分)
第 34 题 C7 未作答

n×nn \times n 矩阵的主对角线(左上到右下)上的元素满足( )。

(1 分)
第 35 题 C8 未作答

4×44 \times 4 矩阵的副对角线(右上到左下)上的元素是( )。

(1 分)
第 36 题 C9 未作答

访问 n×nn \times n 矩阵的最外圈元素(第 00 行、第 n1n-1 行、第 00 列、第 n1n-1 列),遍历条件应为(下标从 00 起)( )。

(1 分)
第 37 题 C10 未作答

把二维数组传给函数 void f(int g[][10]),方括号里列数必须写、行数可以空着,原因是( )。

(1 分)
第 38 题 C11 未作答

char map[8][8]8×88 \times 8 迷宫地图,地图第 33 行内容为 .#..#..#。则 map[2][1] 的值是( )。

(1 分)
第 39 题 C12 未作答

程序:

01for (int i = 1; i <= 3; ++i) {
02    for (int j = 1; j <= i; ++j) cout << '*';
03    cout << '\n';
04}

输出的图形是(从上到下每行的 * 个数依次是)( )。

(1 分)

字符与 ASCII 运算

14 QUESTIONS · 2 POINTS EACH
第 40 题 D1 未作答

阅读程序:

01char c = 'A';
02cout << c + 1;

程序的输出是( )。

(1 分)
第 41 题 D2 未作答

阅读程序:

01char c = 'b';
02c = c + 1;
03cout << c;

程序的输出是( )。

(1 分)
第 42 题 D3 未作答

小写字母与其对应大写字母的 ASCII 码相差 3232(如 'a' = 97'A' = 65)。表达式 'd' - 'A' 的值是( )。

(1 分)
第 43 题 D4 未作答

把小写字母 c 转成对应大写字母的表达式是( )。

(1 分)
第 44 题 D5 未作答

字符变量 ch 中是数字字符 '7',把它转成数值 77 的表达式是( )。

(1 分)
第 45 题 D6 未作答

整数变量 d 的值是 55,把它转成数字字符 '5' 存入字符变量的表达式是( )。

(1 分)
第 46 题 D7 未作答

表达式 '9' < 'A' 的值是( )('9' 的 ASCII 码是 5757'A'6565)。

(1 分)
第 47 题 D8 未作答

ASCII 表中所有大写字母排在小写字母之前('Z' = 90 < 'a' = 97)。因此表达式 'Z' < 'a''a' < 'b' 的值分别是( )。

(1 分)
第 48 题 D9 未作答

下列关于转义字符的说法正确的是( )。

(1 分)
第 49 题 D10 未作答

判断字符 c 是小写字母的条件是( )。

(1 分)
第 50 题 D11 未作答

关于 ' '(空格字符)与 '\0'(结尾符),正确的是( )。

(1 分)
第 51 题 D12 未作答

凯撒加密:小写字母后移 kk 位(超过 z 回绕到 a)。字符 c 加密后的表达式是( )。

(1 分)
第 52 题 D13 未作答

阅读程序:

01char a = '5', b = '3';
02cout << a - b << " " << a;

程序的输出是( )。

(1 分)
第 53 题 D14 未作答

阅读程序:

01char s[] = "aB";
02for (int i = 0; s[i]; ++i)
03    if ('a' <= s[i] && s[i] <= 'z') s[i] -= 32;
04    else s[i] += 32;
05cout << s;

程序的输出是( )。

(1 分)

字符数组与 C 串函数

13 QUESTIONS · 2 POINTS EACH
第 54 题 E1 未作答

char s[10] = "hi"; 在内存中,s[2] 的值是( )。

(1 分)
第 55 题 E2 未作答

scanf("%s", s) 读入字符串 hello world(中间一个空格),s 中存下的是( )。

(1 分)
第 56 题 E3 未作答

char s[] = "china";strlen(s) 的值是( )。

(1 分)
第 57 题 E4 未作答

char s[20] = "abc";sizeof(s)strlen(s) 分别是( )。

(1 分)
第 58 题 E5 未作答

不调用库函数求字符串长度的程序:

01int n = 0;
02while (s[n] != '\0') n++;

循环结束时 n 等于( )。

(1 分)
第 59 题 E6 未作答

两个字符数组 s1s2 各存一个字符串,判断二者内容是否相等的正确写法是( )。

(1 分)
第 60 题 E7 未作答

阅读程序:

01char a[20] = "abc", b[20];
02strcpy(b, a);
03b[0] = 'X';
04cout << a;

程序的输出是( )。

(1 分)
第 61 题 E8 未作答

阅读程序:

01char a[20] = "12", b[] = "34";
02strcat(a, b);
03cout << a;

程序的输出是( )。

(1 分)
第 62 题 E9 未作答

统计字符串中小写字母个数的程序:

01int cnt = 0;
02for (int i = 0; s[i] != '\0'; ++i)
03    if ('a' <= s[i] && s[i] <= 'z') cnt++;

s = "Ab1c"cnt 是( )。

(1 分)
第 63 题 E10 未作答

输入一行 big data(中间一个空格)。下列哪种读法能把整行(含空格)读进字符串( )。

(1 分)
第 64 题 E11 未作答

char s[] = "level"; 用首尾下标判断回文:i00 起、jstrlen(s)-1 起,向中间比较。比较的轮数(s[i]s[j] 比较的次数)是( )。

(1 分)
第 65 题 E12 未作答

阅读程序:

01char s[] = "banana";
02int cnt = 0;
03for (int i = 0; s[i]; ++i)
04    if (s[i] == 'a') cnt++;
05cout << cnt;

程序的输出是( )。

(1 分)
第 66 题 E13 未作答

阅读程序:

01char a[10] = "cat";
02string t = "cat";
03a[0] = 'b';
04t[0] = 'b';
05cout << a << " " << t;

程序的输出是( )。

(1 分)

string 类

14 QUESTIONS · 2 POINTS EACH
第 67 题 F1 未作答

下列定义 string 对象的语句正确且含义明确的是( )。

(1 分)
第 68 题 F2 未作答

阅读程序:

01string s = "hello";
02cout << s.size() << " " << s.length();

程序的输出是( )。

(1 分)
第 69 题 F3 未作答

阅读程序:

01string s = "abcdef";
02cout << s[2] << s.at(0);

程序的输出是( )。

(1 分)
第 70 题 F4 未作答

阅读程序:

01string a = "12", b = "34";
02a += b;
03a += "5";
04cout << a;

程序的输出是( )。

(1 分)
第 71 题 F5 未作答

想把整数 20262026 拼接到字符串末尾,正确的写法是( )。

(1 分)
第 72 题 F6 未作答

阅读程序:

01string s = "abcdefg";
02cout << s.substr(2, 3);

程序的输出是( )。

(1 分)
第 73 题 F7 未作答

阅读程序:

01string s = "banana";
02int p = s.find("na");
03cout << p << " " << (int)s.find("xy");

程序的输出是( )。

(1 分)
第 74 题 F8 未作答

string a = "apple", b = "apply";,表达式 a < b 的值是( )。

(1 分)
第 75 题 F9 未作答

阅读程序:

01string s = "a1b2";
02int letter = 0, digit = 0;
03for (char c : s)
04    if (c >= '0' && c <= '9') digit++;
05    else letter++;
06cout << letter << " " << digit;

程序的输出是( )。

(1 分)
第 76 题 F10 未作答

阅读程序:

01string s;
02s.push_back('x');
03s.push_back('y');
04s.clear();
05cout << s.empty();

程序的输出是( )。

(1 分)
第 77 题 F11 未作答

函数只接收 const char* 参数(如 printf("%s", ...)),string 对象 s 传参时应写( )。

(1 分)
第 78 题 F12 未作答

输入一行 big data,程序:

01string s;
02getline(cin, s);
03cout << s;

输出是( )。

(1 分)
第 79 题 F13 未作答

对比 string 与字符数组,正确的说法是( )。

(1 分)
第 80 题 F14 未作答

string s = "";,下列说法正确的是( )。

(1 分)

易错与陷阱

10 QUESTIONS · 2 POINTS EACH
第 81 题 G1 未作答

int a[5] = {1, 2, 3, 4, 5}; 求和写成 for (int i = 0; i <= 5; ++i) s += a[i];。这个程序( )。

(1 分)
第 82 题 G2 未作答

阅读程序:

01int g[2][3] = {{1, 2, 3}, {4, 5, 6}};
02int s = 0;
03for (int i = 0; i < 3; ++i)
04    for (int j = 0; j < 2; ++j)
05        s += g[i][j];
06cout << s;

程序的结果是( )。

(1 分)
第 83 题 G3 未作答

char a[10] = "abc", b[10] = "abc";,表达式 a == b 的值是( )。

(1 分)
第 84 题 G4 未作答

程序用 cin >> s; 读入,用户输入 hello world 后回车。想得到完整一行却只拿到 hello,原因是( )。

(1 分)
第 85 题 G5 未作答

阅读程序:

01int a[4] = {3, 1, 4, 1};
02int s = 0;
03for (int i = 0; i < 4; ++i)
04    s += a[i] - a[i - 1];
05cout << s;

程序的结果是( )。

(1 分)
第 86 题 G6 未作答

局部数组 int a[3] = {0}; int b[3] = {7, 7, 7}; 紧挨着存放,程序执行 a[3] = 99;(越界写)。可能的后果是( )。

(1 分)
第 87 题 G7 未作答

char c = '5'; int d = 5;,下列值为的表达式是( )。

(1 分)
第 88 题 G8 未作答

for (int i = 0; i < strlen(s); ++i) 在字符串很长、循环很大时的隐患是( )。

(1 分)
第 89 题 G9 未作答

两个数组 int a[5], b[5]; 都已有数据,想把 b 的内容整体复制到 a,正确做法是( )。

(1 分)
第 90 题 G10 未作答

把字符数组 t 里的 33 个有效字符倒序复制到 r 后直接 cout << r;,输出末尾粘了乱码。最可能的原因是( )。

(1 分)

综合应用

10 QUESTIONS · 2 POINTS EACH
第 91 题 H1 未作答

阅读程序:

01string s = "abracadabra";
02int cnt[26] = {0};
03for (char c : s)
04    if ('a' <= c && c <= 'z') cnt[c - 'a']++;
05cout << cnt['b' - 'a'];

程序的输出是( )。

(1 分)
第 92 题 H2 未作答

一行由小写字母和空格组成的句子(单词间恰一个空格,句首句尾无空格),统计单词个数的最简判断是( )。

(1 分)
第 93 题 H3 未作答

数组 a = {1, 1, 2, 2, 2, 1, 1},求"连续相等的最长一段"的长度,结果是( )。

(1 分)
第 94 题 H4 未作答

数组 a = {3, 1, 3, 2, 1},按原次序保留每个值第一次出现(后面重复出现的丢弃)后输出的序列是( )。

(1 分)
第 95 题 H5 未作答

阅读程序:

01int n = 407, d[10], k = 0;
02while (n > 0) {
03    d[k++] = n % 10;
04    n /= 10;
05}
06for (int i = 0; i < k; ++i) cout << d[i];

程序的输出是( )。

(1 分)
第 96 题 H6 未作答

把十进制数 1313 转二进制:不断除 22 取余数存入数组,再倒序输出数组。输出是( )。

(1 分)
第 97 题 H7 未作答

用查表法加密:enc[26] 存每个小写字母的密文字符。明文 s 加密的核心一行是( )。

(1 分)
第 98 题 H8 未作答

判断字符串是否回文:i = 0, j = s.size() - 1while (i < j) 中比较后应执行( )。

(1 分)
第 99 题 H9 未作答

3×33 \times 3 矩阵 g = {{1,2,3},{4,5,6},{7,8,9}},顺时针打印最外圈(从 g[0][0] 起:上边从左到右、右边从上到下、下边从右到左、左边从下到上),输出是( )。

(1 分)
第 100 题 H10 未作答

下列说法错误的是( )。

(1 分)

真 题 演 练

13 QUESTIONS · 真题演练不计分
第 102~107 题 阅读程序 (共 0 分) 未作答

1  #include <cstdio>
2  using namespace std;
3  int n, m;
4  int a[100], b[100];
5 
6  int main() {
7      scanf("%d%d", &n, &m);
8      for (int i = 1; i <= n; ++i)
9          a[i] = b[i] = 0;
10      for (int i = 1; i <= m; ++i) {
11          int x, y;
12          scanf("%d%d", &x, &y);
13          if (a[x] < y && b[y] < x) {
14              if (a[x] > 0)
15                  b[a[x]] = 0;
16              if (b[y] > 0)
17                  a[b[y]] = 0;
18              a[x] = y;
19              b[y] = x;
20          }
21      }
22      int ans = 0;
23      for (int i = 1; i <= n; ++i) {
24          if (a[i] == 0)
25              ++ans;
26          if (b[i] == 0)
27              ++ans;
28      }
29      printf("%d\n",ans);
30      return 0;
31  }

假设输入的 nnmm 都是正整数,xxyy 都是在 [1,n][1,n] 范围内的整数,完成下面的判断题和单选题。

102.

m>0m>0 时,输出的值一定小于 2n2n。( )

103.

执行完第 2727 行的 ++ans 时,ans 一定是偶数。( )

104.

a[i]b[i] 不可能同时大于 00。( )

105.

若程序执行到第 1313 行时,x 总是小于 y,那么第 1515 行不会被执行。( )

106.

mmx 两两不同,且 mmy 两两不同,则输出的值为( )。

107.

mmx 两两不同,且 mmy 都相等,则输出的值为( )。

CSP-J 2019 · 阅读程序 第22-27题 | 知识点 一维数组、模拟
第 109~113 题 完善程序 (共 0 分) 未作答

(矩阵变幻)有一个奇幻的矩阵,在不停地变幻,其变幻方式为:数字 00 变成矩阵 [0001]\begin{bmatrix}0&0\\0&1\end{bmatrix},数字 11 变成矩阵 [1110]\begin{bmatrix}1&1\\1&0\end{bmatrix}。最初该矩阵只有一个元素 00,变幻 nn 次后,矩阵会变成什么样?

例如,矩阵最初为:[0]\begin{bmatrix}0\end{bmatrix};矩阵变幻 11 次后:[0001]\begin{bmatrix}0&0\\0&1\end{bmatrix};矩阵变幻 22 次后:[0000010100110110]\begin{bmatrix}0&0&0&0\\0&1&0&1\\0&0&1&1\\0&1&1&0\end{bmatrix}

输入一行一个不超过 1010 的正整数 nn。输出变幻 nn 次后的矩阵。

试补全程序。

提示:

<< 表示二进制左移运算符,例如 (11)2(11)_2 << 2=(1100)22=(1100)_2

^ 表示二进制异或运算符,它将两个参与运算的数中的每个对应的二进制位一一进行比较,若两个二进制位相同,则运算结果的对应二进制位为 00,反之为 11

1  #include <cstdio>
2  using namespace std;
3  int n;
4  const int max_size = 1 << 10;
5 
6  int res[max_size][max_size];
7 
8  void recursive(int x, int y, int n, int t) {
9      if (n == 0) {
10          res[x][y] = ①;
11          return;
12      }
13      int step = 1 << (n - 1);
14      recursive(②, n - 1, t);
15      recursive(x, y + step, n - 1, t);
16      recursive(x + step, y, n - 1, t);
17      recursive(③, n - 1, !t);
18  }
19 
20  int main() {
21      scanf("%d", &n);
22      recursive(0, 0, ④);
23      int size = ⑤;
24      for (int i = 0; i < size; ++i) {
25          for (int j = 0; j < size; ++j)
26              printf("%d", res[i][j]);
27          puts("");
28      }
29      return 0;
30  }

109.

①处应填( )。

110.

②处应填( )。

111.

③处应填( )。

112.

④处应填( )。

113.

⑤处应填( )。

CSP-J 2019 · 完善程序 第34-38题 | 知识点 递归、二维数组、移位运算
第 115~119 题 完善程序 (共 0 分) 未作答

(计数排序)计数排序是一个广泛使用的排序方法。下面的程序使用双关键字计数排序,将 nn1000010000 以内的整数,从小到大排序。

例如有三对整数 (3,4)(3,4)(2,4)(2,4)(3,3)(3,3),那么排序之后应该是 (2,4)(2,4)(3,3)(3,3)(3,4)(3,4)

输入第一行为 nn,接下来 nn 行,第 ii 行有两个数 a[i]b[i],分别表示第 ii 对整数的第一关键字和第二关键字。

从小到大排序后输出。

数据范围 1n1071\le n\le 10^71a[i],b[i]1041\le a[i],b[i]\le 10^4

提示:应先对第二关键字排序,再对第一关键字排序。数组 ord[] 存储第二关键字排序的结果,数组 res[] 存储双关键字排序的结果。

试补全程序。

1  #include <cstdio>
2  #include <cstring>
3  using namespace std;
4  const int maxn = 10000000;
5  const int maxs = 10000;
6 
7  int n;
8  unsigned a[maxn], b[maxn], res[maxn], ord[maxn];
9  unsigned cnt[maxs + 1];
10 
11  int main() {
12      scanf("%d", &n);
13      for (int i = 0; i < n; ++i)
14          scanf("%d%d", &a[i], &b[i]);
15      memset(cnt, 0, sizeof(cnt));
16      for (int i = 0; i < n; ++i)
17          ①;  // 利用 cnt 数组统计数量
18      for (int i = 0; i < maxs; ++i)
19          cnt[i + 1] += cnt[i];
20      for (int i = 0; i < n; ++i)
21          ②;  // 记录初步排序结果
22      memset(cnt, 0, sizeof(cnt));
23      for (int i = 0; i < n; ++i)
24          ③;  // 利用 cnt 数组统计数量
25      for (int i = 0; i < maxs; ++i)
26          cnt[i + 1] += cnt[i];
27      for (int i = n - 1; i >= 0; --i)
28          ④;  // 记录最终排序结果
29      for (int i = 0; i < n; ++i)
30          printf("%d %d\n", ⑤);
31      return 0;
32  }

115.

①处应填( )。

116.

②处应填( )。

117.

③处应填( )。

118.

④处应填( )。

119.

⑤处应填( )。

CSP-J 2019 · 完善程序 第39-43题 | 知识点 计数排序、基数排序、一维数组
第 17 题 单选 未作答

AAnn 个实数的数组,考虑下面的递归算法:

XYZ(A[1..n])
1 if n = 1 then return A[1]
2 else temp ← XYZ(A[1..n-1])
3      if temp < A[n]
4          then return temp
5          else return A[n]

请问算法 XYZ 的输出是什么?( )

(0 分)
CSP-J 2020 · 单选 第6题 | 知识点 程序阅读与输出推断、递归、一维数组
第 123~128 题 阅读程序 (共 0 分) 未作答

1  #include <cstdlib>
2  #include <iostream>
3  using namespace std;
4 
5  char encoder[26] = {'C', 'S', 'P', 0};
6  char decoder[26];
7 
8  string st;
9 
10  int main() {
11      int k = 0;
12      for (int i = 0; i < 26; ++i)
13          if (encoder[i] != 0) ++k;
14      for (char x = 'A'; x <= 'Z'; ++x) {
15          bool flag = true;
16          for (int i = 0; i < 26; ++i)
17              if (encoder[i] == x) {
18                  flag = false;
19                  break;
20              }
21          if (flag) {
22              encoder[k] = x;
23              ++k;
24          }
25      }
26      for (int i = 0; i < 26; ++i)
27          decoder[encoder[i] - 'A'] = i + 'A';
28      cin >> st;
29      for (int i = 0; i < st.length(); ++i)
30          st[i] = decoder[st[i] - 'A'];
31      cout << st;
32      return 0;
33  }

123.

输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。( )

124.

若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样。( )

125.

将第 1212 行的 i < 26 改为 i < 16,程序运行结果不会改变。( )

126.

将第 2626 行的 i < 26 改为 i < 16,程序运行结果不会改变。( )

127.

若输出的字符串为 ABCABCABCA,则下列说法正确的是( )。

128.

若输出的字符串为 CSPCSPCSPCSP,则下列说法正确的是( )。

CSP-J 2020 · 阅读程序 第16-21题 | 知识点 string类、字符ASCII运算、密码与加密
第 130~135 题 阅读程序 (共 0 分) 未作答

1  #include <iostream>
2  using namespace std;
3 
4  long long n, ans;
5  int k, len;
6  long long d[1000000];
7 
8  int main() {
9      cin >> n >> k;
10      d[0] = 0;
11      len = 1;
12      ans = 0;
13      for (long long i = 0; i < n; ++i) {
14          ++d[0];
15          for (int j = 0; j + 1 < len; ++j) {
16              if (d[j] == k) {
17                  d[j] = 0;
18                  d[j + 1] += 1;
19                  ++ans;
20              }
21          }
22          if (d[len - 1] == k) {
23              d[len - 1] = 0;
24              d[len] = 1;
25              ++len;
26              ++ans;
27          }
28      }
29      cout << ans << endl;
30      return 0;
31  }

假设输入的 nn 是不超过 2622^{62} 的正整数,kk 都是不超过 1000010000 的正整数,完成下面的判断题和单选题。

130.

k=1k=1,则输出 ans 时,len=n。( )

131.

k>1k>1,则输出 ans 时,len 一定小于 nn。( )

132.

k>1k>1,则输出 ans 时,klenk^{len} 一定大于 nn。( )

133.

若输入的 nn 等于 101510^{15}kk11,则输出等于( )。

134.

若输入的 nn 等于 205891132094649205891132094649(即 3303^{30})、kk33,则输出等于( )。

135.

若输入的 nn 等于 100010002000090100010002000090kk1010,则输出等于( )。

CSP-J 2020 · 阅读程序 第22-27题 | 知识点 进制运算、模拟、一维数组
第 137~141 题 完善程序 (共 0 分) 未作答

(Josephus 问题)有 nn 个人围成一个圈,依次标号 00n1n-1。从 00 号开始,依次 0,1,0,1,0,1,0,1,\ldots 交替报数,报到 11 的人会离开,直至圈中只剩下一个人。求最后剩下人的编号。

试补全模拟程序。

1  #include <iostream>
2 
3  using namespace std;
4 
5  const int MAXN = 1000000;
6  int F[MAXN];
7 
8  int main() {
9      int n;
10      cin >> n;
11      int i = 0, p = 0, c = 0;
12      while (①) {
13          if (F[i] == 0) {
14              if (②) {
15                  F[i] = 1;
16                  ③;
17              }
18              ④;
19          }
20          ⑤;
21      }
22      int ans = -1;
23      for (i = 0; i < n; i++)
24          if (F[i] == 0)
25              ans = i;
26      cout << ans << endl;
27      return 0;
28  }

137.

①处应填( )

138.

②处应填( )

139.

③处应填( )

140.

④处应填( )

141.

⑤处应填( )

CSP-J 2021 · 完善程序 第34-38题 | 知识点 模拟、一维数组
第 143~148 题 阅读程序 (共 0 分) 未作答

1  #include <algorithm>
2  #include <iostream>
3  #include <limits>
4 
5  using namespace std;
6 
7  const int MAXN = 105;
8  const int MAXK = 105;
9 
10  int h[MAXN][MAXK];
11 
12  int f(int n, int m)
13  {
14      if (m == 1) return n;
15      if (n == 0) return 0;
16 
17      int ret = numeric_limits<int>::max();
18      for (int i = 1; i <= n; i++)
19          ret = min(ret, max(f(n - i, m), f(i - 1, m - 1)) + 1);
20      return ret;
21  }
22 
23  int g(int n, int m)
24  {
25      for (int i = 1; i <= n; i++)
26          h[i][1] = i;
27      for (int j = 1; j <= m; j++)
28          h[0][j] = 0;
29 
30      for (int i = 1; i <= n; i++) {
31          for (int j = 2; j <= m; j++) {
32              h[i][j] = numeric_limits<int>::max();
33              for (int k = 1; k <= i; k++)
34              h[i][j] = min(
35                  h[i][j],
36                  max(h[i - k][j], h[k - 1][j - 1]) + 1);
37          }
38      }
39 
40      return h[n][m];
41  }
42 
43  int main()
44  {
45      int n, m;
46      cin >> n >> m;
47      cout << f(n, m) << endl << g(n, m) << endl;
48      return 0;
49  }

143.

当输入为 7 3 时,第 1919 行用来取最小值的 min 函数执行了 449449 次。( )

144.

输出的两行整数总是相同的。( )

145.

m11 时,输出的第一行总为 n。( )

146.

算法 g(n,m) 最为准确的时间复杂度分析结果为( )。

147.

当输入为 20 2 时,输出的第一行为( )。

148.

当输入为 100 100 时,输出的第一行为( )。

CSP-J 2022 · 阅读程序 第22-27题 | 知识点 线性DP、递归、二维数组
第 150~155 题 阅读程序 (共 0 分) 未作答

1  #include <iostream>
2  #include <vector>
3  #include <algorithm>
4  using namespace std;
5 
6  int f(string x, string y) {
7      int m = x.size();
8      int n = y.size();
9      vector<vector<int>> v(m+1, vector<int>(n+1, 0));
10      for (int i = 1; i <= m; i++) {
11          for (int j = 1; j <= n; j++) {
12              if (x[i-1] == y[j-1]) {
13                  v[i][j] = v[i-1][j-1] + 1;
14              } else {
15                  v[i][j] = max(v[i-1][j], v[i][j-1]);
16              }
17          }
18      }
19      return v[m][n];
20  }
21 
22  bool g(string x, string y) {
23      if (x.size() != y.size()) {
24          return false;
25      }
26      return f(x + x, y) == y.size();
27  }
28 
29  int main() {
30      string x, y;
31      cin >> x >> y;
32      cout << g(x, y) << endl;
33      return 0;
34  }

150.

f 函数的返回值小于等于 min(n,m)。( )

151.

f 函数的返回值等于两个输入字符串的最长公共子串的长度。( )

152.

当输入两个完全相同的字符串时,g 函数的返回值总是 true。( )

153.

将第 1919 行中的 v[m][n] 替换为 v[n][m],那么该程序( )。

154.

当输入为 csp-j p-jcs 时,输出为( )。

155.

当输入为 csppsc spsccp 时,输出为( )。

CSP-J 2023 · 阅读程序 第21-26题 | 知识点 LCS、线性DP、二维数组
第 157~161 题 完善程序 (共 0 分) 未作答

试补全程序。

1  #include <iostream>
2  #include <vector>
3 
4  using namespace std;
5 
6  int find_missing(vector<int>& nums) {
7      int left = 0, right = nums.size() - 1;
8      while (left < right) {
9          int mid = left + (right - left) / 2;
10          if (nums[mid] == mid + ①) {
11              ②;
12          } else {
13              ③;
14          }
15      }
16      return ④;
17  }
18 
19  int main() {
20      int n;
21      cin >> n;
22      vector<int> nums(n);
23      for (int i = 0; i < n; i++) cin >> nums[i];
24      int missing_number = find_missing(nums);
25      if (missing_number == ⑤) {
26          cout << "Sequence is consecutive" << endl;
27      } else {
28          cout << "Missing number is " << missing_number << endl;
29      }
30      return 0;
31  }

157.

①处应填( )

158.

②处应填( )

159.

③处应填( )

160.

④处应填( )

161.

⑤处应填( )

CSP-J 2023 · 完善程序 第33-37题 | 知识点 二分查找、一维数组
第 163~167 题 完善程序 (共 0 分) 未作答

试补全程序。

1  #include <iostream>
2  #include <string>
3  #include <vector>
4  using namespace std;
5 
6  int min(int x, int y, int z) {
7      return min(min(x, y), z);
8  }
9 
10  int edit_dist_dp(string str1, string str2) {
11      int m = str1.length();
12      int n = str2.length();
13      vector<vector<int>> dp(m + 1, vector<int>(n + 1));
14 
15      for (int i = 0; i <= m; i++) {
16          for (int j = 0; j <= n; j++) {
17              if (i == 0)
18                  dp[i][j] = ①;
19              else if (j == 0)
20                  dp[i][j] = ②;
21              else if (③)
22                  dp[i][j] =④;
23              else
24                  dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j], ⑤);
25          }
26      }
27      return dp[m][n];
28  }
29 
30  int main() {
31      string str1, str2;
32      cin >> str1 >> str2;
33      cout << "Minimum number of operations: "
34          << edit_dist_dp(str1, str2) << endl;
35      return 0;
36  }

163.

①处应填( )

164.

②处应填( )

165.

③处应填( )

166.

④处应填( )

167.

⑤处应填( )

CSP-J 2023 · 完善程序 第38-42题 | 知识点 线性DP、string类
第 169~174 题 阅读程序 (共 0 分) 未作答

1  #include <iostream>
2  #include <vector>
3  using namespace std;
4 
5  int compute(vector<int>& cost) {
6    int n = cost.size();
7    vector<int> dp(n+1, 0);
8    dp[1] = cost[0];
9    for (int i = 2; i <= n; i++) {
10      dp[i] = min(dp[i-1], dp[i-2]) + cost[i-1];
11    }
12    return min(dp[n], dp[n-1]);
13  }
14 
15  int main() {
16    int n;
17    cin >> n;
18    vector<int> cost(n);
19    for (int i = 0; i < n; i++) {
20      cin >> cost[i];
21    }
22    cout << compute(cost) << endl;
23    return 0;
24  }

169.

当输入的 cost 数组为 {10, 15, 20} 时,程序的输出为 15。( )

170.

如果将 dp[i-1] 改为 dp[i-3],程序可能会产生编译错误。( )

171.

程序总是输出 cost 数组中最小的元素。( )

172.

当输入的 cost 数组为 {1, 100, 1, 1, 1, 100, 1, 1, 100, 1} 时,程序的输出为( )。

173.

如果输入的 cost 数组为 {10, 15, 30, 5, 5, 10, 20},程序的输出为( )。

174.

若将代码中的 min(dp[i-1], dp[i-2]) + cost[i-1] 修改为 dp[i-1] + cost[i-2],输入 cost 数组为 {5, 10, 15} 时,程序的输出为( )。

CSP-J 2024 · 阅读程序 第21-26题 | 知识点 插入排序、数组越界
第 176~181 题 阅读程序 (共 0 分) 未作答

1  #include <algorithm>
2  #include <cstdio>
3  #include <cstring>
4  #define ll long long
5  int f[5007][5007];
6  int a[5007], b[5007];
7  int n;
8  int main(){
9      scanf("%d", &n);
10      for (int i = 1; i <= n; ++i) {
11          scanf("%d", &a[i]);
12      }
13      for (int i = 1; i <= n; ++i) {
14          scanf("%d", &b[i]);
15      }
16      for (int i = 1; i <= n; ++i) {
17          for (int j = 1; j <= n; ++j) {
18              f[i][j] = std::max(f[i][j], std::max(f[i - 1][j], f[i][j - 1]));
19              if (a[i] == b[j]) {
20                  f[i][j] = std::max(f[i][j], f[i - 1][j - 1] + 1);
21              }
22          }
23      }
24      printf("%d\n", f[n][n]);
25      return 0;
26  }

176.

当输入为 4 1 2 3 4 1 3 2 2 时,输出为 22。( )

177.

当程序运行完毕后,对于所有的 1i,jn1 \le i,j \le n,都一定有 f[i][j]f[n][n]f[i][j] \le f[n][n]。( )

178.

将第 1818 行的 f[i][j] = std::max(f[i][j], std::max(f[i - 1][j], f[i][j - 1])); 删去后,并不影响程序运行结果。( )

179.

输出的答案满足的性质有( )。

180.

如果在第 1616 行的循环前加上以下两行:

1  std::sort(a + 1, a + n + 1);
2  std::sort(b + 1, b + n + 1);

则答案会( )。

181.

如果输入的 a = {1, 2, ..., n},而且 b 数组中数字均为 1n1 \sim n 中的正整数,则上述代码等价于下面哪个问题?( )

CSP-J 2025 · 阅读程序 第28-33题 | 知识点 插入排序、字符ASCII运算