2021CSP-J组初试题分析1-21

 2024-02-08 01:03:02  阅读 0

-J组预赛第1-21轮真题分析

2022 年 9 月 15 日 5,801

分析1

测试题: 1.下列哪项不属于面向对象的编程语言( )。

A.C++

B.

Java语言

直流

分析:

背景知识:

从描述客观系统的角度来看,编程语言可以分为:

(1)面向过程的语言

由“数据结构+算法”编程范式组成的编程语言称为面向过程的语言。代表性语言包括C等。

(2)面向对象语言

由“对象+消息”编程范式组成的编程语言称为面向对象语言。 比较流行的面向对象语言有Basic、Java、C++等。

知识点分类:

计算机基础知识-计算机语言

答案分析:

本题中选项A、B、C都是面向对象的编程语言。 只有选项D中的C语言是面向过程的编程语言,所以正确答案应该是D。

分析2

测试问题: 2.下列哪个奖项与计算机领域最相关( )。

A.奥斯卡奖

B、图灵奖

C、诺贝尔奖

D.普利策奖

分析:

背景知识:

奥斯卡奖

奥斯卡一般指奥斯卡金像奖。 奥斯卡金像奖( ),又称奥斯卡金像奖(中文为学院奖),是由美国电影艺术与科学学院主办的电影奖项,创立于1929年。该奖项是历史最悠久、最权威、最专业的电影奖项在美国,也是世界上最具影响力的电影奖。 PS:你听说过小金人吗? 奥斯卡是一座10.25英寸高的男性人体雕像。 铜像手持剑,站在胶片上。 表面镀金,故称奥斯卡奖。

图灵奖

图灵奖,全称AM图灵奖(ACM AM Award),是计算机协会(ACM)于1966年设立的计算机奖项,以阿兰·图灵(1912年1954年6月23日—1954年6月7日)的名字命名。英国数学家、逻辑学家,被誉为计算机之父、人工智能之父。 旨在奖励对计算做出重要贡献的个人。 图灵奖获奖要求极高,颁奖流程极其严格。 一般来说,每年仅授予一名计算机科学家。 图灵奖是计算机领域的国际最高奖项,被誉为“计算机界的诺贝尔奖”。

诺贝尔奖

诺贝尔奖(瑞典语:Nobel,英语:)是指根据诺贝尔1895年遗嘱设立的五个奖项,包括:物理奖、化学奖、和平奖、生理学或医学奖和文学奖。 诺贝尔经济学奖由瑞典中央银行于1968年设立,以表彰经济学领域的杰出贡献。 人们。

普利策奖

普利策奖(The ),也称为普利策新闻奖。 该奖项根据美国报业巨头约瑟夫·普利策( )的遗愿于1917年设立,后来发展成为美国新闻界的最高荣誉奖。 经过不断完善的评选制度,普利策奖已成为新闻领域的国际最高奖项,被誉为“新闻界的诺贝尔奖”。

知识点分类:

计算机基础知识-计算机通用知识

答案分析:

本题中,选项A奖项属于电影领域; C选项奖项属于物理、化学、和平、生理学、医学和经济学领域; D选项奖项属于新闻领域。 只有选项B图灵奖是在计算领域。 所以正确答案应该是选项B。

真题解析3

3、目前主流计算机存储数据最终都是转换成( )数据进行存储。

A.二进制

B、十进制

C、八进制

D、十六进制

分析:

背景知识:

基本系统又称为进位计数系统,是一种人为定义的带进位的计数方法。 对于任何基数制——X基数制,是指对每一位数字进行的数运算,每X一位进位。十进制每十分之一进位一位,十六进制每十六位进位一位,二进制结转每两个,依此类推,基于 x 的系统结转每个 x。

在我们的日常生活中,十六进制的例子有很多,比如:

一分六十秒,每六十加一,就是六十进制;

一天有二十四小时,每二十四小时加一,就是十六进制;

一周有七天,每第七天紧跟着一天,这就是七进制;

一年有十二个月,每十二个月加一,为十二基制;

计算机使用二进制的原因:

1、技术实现简单:计算机是由逻辑电路组成的。 逻辑电路通常只有两种状态,开关接通和断开。 这两种状态可以用“1”和“0”来表示。

2、简化运算规则:两个二进制数的和、积运算有三种组合。 运算规则简单,有利于简化计算机内部结构,提高运算速度。

3、适合逻辑运算:逻辑代数是逻辑运算的理论基础。 二进制只有两位数字,与逻辑代数中的“真”和“假”相符。

4、转换方便:二进制和十进制、八进制和十六进制数字很容易相互转换。

5、意味着数据抗干扰能力强,可靠性高:由于每一位数据只有高和低两种状态,当受到干扰到一定程度时,仍然可以可靠地区分是否为高或低。

知识点分类:

计算机基础知识库及基数转换

答案分析:

本题B选项是十进制。 由于人体解剖学的特点,双手都有十个手指。 因此,在人类自发采用的进位系统中,十进制是最常用的一种。 引入选项C八进制和D选项十六进制是因为它们很容易在二进制之间转换,并且比二进制更方便读、写和记忆(例如IPv6地址用十六进制表示)。 只有选项A二进制被广泛应用于计算机数据处理中。 所以正确答案应该是A。

真题解析8

8. 如果一棵二叉树只有根节点,那么二叉树的高度为 1。高度为 5 的完全二叉树有哪些 () 不同形式?

A.16

B、15

C.17

D.32

分析:

背景知识:

二叉树:二叉树(Tree)是n(n>=0)个节点的有限集合。 该集合要么是一个空集(称为空二叉树),要么由一个根节点和两个不相交的树组成。 二叉树由根节点的左子树和根节点的右子树组成。

满二叉树:在二叉树中。 如果所有分支节点都有左子树和右子树,并且所有叶子都在同一层,这样的二叉树称为满二叉树。

完全二叉树:有n个节点的二叉树按层编号。 如果数字是 i(1

后序遍历:

遍历过程为:

其左子树的后序遍历和右子树的后序遍历均访问根节点。

后序遍历顺序 =>

前缀表达式、中缀表达式和后缀表达式都是四种算术运算的表达式,用于对四种算术运算求值。

中缀表达式:

中缀表达式是常见的运算表达式,如(1+2)×3-4

前缀表达式:

前缀表达式也称为波兰表达式。 前缀表达式的运算符位于操作数之前,如 × + 3 4 5

后缀表达式:

后缀表达式也称为逆波兰式表达式,与前缀表达式类似,只不过运算符位于操作数之后,例如 1 2 + 3 × 4 –

知识点分类:

编程基础-树

答案分析:题干中的表达式a*(b+c)*d是一个中缀表达式。 转换成二叉树后,就是中序遍历的结果。 后缀表达式就是按后序遍历二叉树(如下图)

后序遍历顺序 => abc + * d *

结果序列为:abc+*d*,所以正确答案应该是B。

真题解析10

10、有6人,两人组成一队,一共组成三队。 团队编号不区分。 有( )种不同的组队情况。

A.10

B、15

C.30

D.20

分析:

背景知识:

安排():

从n个不同的元素中,随机选择m(m≤n)个元素,并按一定的顺序排列在一列中,称为从n个元素中m个元素的排列。

从n个不同元素中提取m(m≤n)个元素的所有排列数称为从n个不同元素中提取m个元素的排列数,用符号P(n,m)表示。

计算公式为:P(n,m)=n(n-1)(n-2)...(n-m+1)=n!/(nm)!

嗯! 表示n(n-1)(n-2)…1,且指定0!=1。

例如:P(6,2) = 6!/(6-2)! = 6!/4! = 6*5*4*3*2*1/4*3*2*1 = 30

组合()

从n个不同的元素中,取出任意m(m≤n)个元素组合成一个组,称为从n个元素中取出m个元素的组合。

从n个不同元素中取出的m(m≤n)个元素的所有组合数称为从n个不同元素中取出的m个元素的组合数,用符号c(n,m)表示。

计算公式为:C(n,m)=P(n,m)/m!

嗯! 表示n(n-1)(n-2)…1,且指定0!=1。

例如:C(6,2) = P(6,2) / 2! = 6*5*4*3*2*1/2*1 = 15

知识点分类:

解决应用问题——排列组合

答案分析:

本题要求六人中两人组成一队,总共组成三队,则:

对于第一队:

此时有6人可供选择,共有C(6,2)=15种组合

对于第二队:

此时有4人可供选择,共有C(4, 2) = 6种组合

对于第三队:

此时只剩下2人可供选择,组合也只有1种。

所以一共有15*6*1=90种不同的组合。

题目要求团队编号不要区分(这里可以假设6个人编号为A、B、C、D、E、F),因此同一团队在组合中会出现6次。

例如:队伍组合为AB一队、CD一队、EF一队

那么AB、CD、EF AB、EF、CD CD、AB、EF CD、EF、AB EF、AB、CD EF、CD、AB这六种组合按照题目要求都视为同一个队伍情况。

因此,无论队伍数量多少,都有90/6=15种不同的组队情况。

正确答案应该是选项B。

真题解析11

11、数据压缩编码中的哈夫曼编码方法本质上是一种( )策略。

A、枚举

B、贪婪

C、递归

D.动态规划

分析:

背景知识:

枚举算法:根据问题本身的性质,在有限的可能解集合中,一一列出问题的所有可能解,并在一一列出的过程中,利用问题给出的测试条件来判断每个可能的解是否是问题的真正解,如果不是,则丢弃; 如果有,请采纳。

贪心算法:贪心算法是指在解决问题时,总是做出当前最好的选择,以便尽快得到更好的解决方案。 当求解达到算法中的某个步骤并且无法继续时,算法停止。

递归算法:通过反复将问题分解为相似的子问题来解决问题的算法。 递归算法可以将大规模问题转化为小规模的相似子问题来解决。

动态规划算法:通过将要解决的问题分解为若干个子问题,首先求解子问题,然后从这些子问题的解中得到原问题的解。

知识点分类:

解决应用问题-基础算法

答案分析:

霍夫曼提出了一种贪心算法来构造最优前缀码,所得到的编码方案称为霍夫曼编码。 哈夫曼编码是一种非常有效的编码方法,广泛用于数据文件压缩。 其压缩率通常在20%至90%之间。 霍夫曼编码算法利用文件中字符的频率表来建立每个字符作为0和1的字符串的最佳表示。霍夫曼编码是使用贪心算法的典型例子,所以这道题的正确答案应该是B.

真题解析12

12. 由 1、1、2、2、3 五个数字组成的三位数共有 ( ) 个。

A.18

B、15

C.12

D.24

分析:

背景知识:

安排():

从n个不同的元素中,随机选择m(m≤n)个元素,并按一定的顺序排列在一列中,称为从n个元素中m个元素的排列。

从n个不同元素中提取m(m≤n)个元素的所有排列数称为从n个不同元素中提取m个元素的排列数,用符号P(n,m)表示。

计算公式为:P(n,m)=n(n-1)(n-2)...(n-m+1)=n!/(nm)!

知识点分类:

解决应用题-排列

答案分析:

这个问题可以分两种情况来考虑:

1、三位数的百位、十位、个位中没有重复的数字,如下图:

此时有P(3,3)=6个三位数组合:

123、132、213、231,312、321

2、三位数的百位、十位、个位中有重复的数字,如下图:

此时有4*3=12个三位数组合:

112,121,,131,311

221,212,122 223,232,322

将两种情况相加:6+12=18。 有 18 种不同的三位数组合,所以正确答案应该是 A。

真题解析13

13.考虑以下递归算法

solve(n)  
 if n <=1 return 1   
  else if n>=5 return n*solve(n-2)  
 else return n*solve(n-1)

那么调用solve(7)得到的返回结果为( )

A.105

B.840

C.210

D.420

分析:

背景知识:

通过一系列调用语句直接或间接调用自身的函数称为递归函数。 递归通常将一个大而复杂的问题转化为与原始问题类似的较小问题。 如果一个问题要使用递归函数(方法)来解决,它必须满足两个条件:

1.这个问题可以转化为一个新问题。 新问题的解与原问题一模一样,但问题的规模变小了。

2、递归必须有明确的结束条件(边界)

知识点分类:

C++ 编程-函数与递归

答案分析:

首先分析一下问题中给出的代码:

solve(n)  //定义名为solve的函数,参数为n 
if n <=1 return 1  //如果参数n小于或等于1,返回值为1  
else if n>=5 return n*solve(n-2)// 如果参数n大于或等于5,则返回值为:n*solve(n-2) 
 else return n*solve(n-1)//其他情况下,返回值为:n*solve(n-1)

本题递归算法的递归函数调用流程如下图所示:

求解(7)=7*求解(5)

求解(5)=5*求解(3)

求解(3)=3*求解(2)

求解(2)=2*求解(1)

求解(1)=1

所以求解(7)=7*5*3*2*1=210,正确答案应该是C。

真题解析14

14、以a为起点,对右边的无向图进行深度优先遍历,则b、c、d、e这四个点中可能最后遍历到的点数为()。

A.1

B.2

C.3

D.4

分析:

背景知识:

从图中的某个顶点开始,依次访问图中剩余的顶点,使得每个顶点只被访问一次的过程称为图的遍历。

图的遍历有两种类型:深度优先遍历(DFS)和广度优先遍历(BFS)。

深度优先遍历()从图中的某个顶点v开始,访问这个顶点,然后从v的未访问过的相邻点开始深度优先遍历图,直到图中所有与v有路径相连的顶点都有被访问过。 到达。 如果此时图中还有未访问的顶点,则选择另一个未访问的顶点作为新的源点,重复上述过程,直到图中的所有顶点都被访问过。

广度优先遍历()从图中的某个顶点v开始,先访问起始点v,然后依次访问v的所有相邻点w1,w2,...,wt,然后依次访问所有相邻点wl, w2,..., wt 未访问的顶点。 依此类推,直到图中所有具有连接到源点v的路径的顶点都被访问过。

知识点分类:

算法-图论算法-图的深度优先遍历算法

答案分析:

深度优先遍历算法的流程图如下:

本题存在三种可能的深度优先遍历顺序:

=>abdce=>acedb=>acdbe

有可能最后遍历的点只能是e或b,所以有可能最后遍历的点数是2,所以正确答案应该是B。

真题解析15

15、四个人想从A点坐船过河到B点,船从A点出发,船一次最多可容纳两人。 已知四人单独乘船过河的时间各为1、2、4、8,两人乘船过河的时间为两人时间中较大者人们独自过河。 那么最短的()时间可以让四个人过河到达B点(包括从B点开船回到A点的时间)。

A.14

B.15C。 16D。 17 号

分析:

背景知识:

这道题是新奥比赛中的一道经典题——过河题。 典型描述如下:

有 X 个人想要过河,每个人过河需要时间 T。 河上只有一艘船,一次最多可容纳两人划过河。 两个人划船过河所需的时间取决于谁过河时间更长的人。 例如,两个人A和B过河所需的时间分别为Ta、Tb。 那么,他们划船过河所花的时间为:max{Ta,Tb}(即花时间多的人过河所花的时间为Time计算),求最短的时间每个人都需要过河。

问题分析:

假设X=4,即有四个人要过河。 假设四个人分别用a、b、c、d表示,所需时间Ta

1、过河顺序为:ac、a、ad、a,耗时:t1=2Ta+Tc+Td

让需要时间最少的a 分别送c 和d 过河。 因为a需要的时间最少,所以a每次将船送回的时间也最少。 所以选择发送可能是最好的方式。

2、过河顺序为:ab,a(b),cd,b(a) 耗时:t2=Ta+2Tb+Td

如果c和d都需要很长时间才能过河,那么就让他们一起过去。 这样可以有效去掉c的过河时间比较少,然后提前放走其中一个。 让b留在对岸(之前被a送到对岸),然后还船。

以上两种是唯一有希望送C、D过河的方法。

t1−t2=Ta+Tc−2Tb

显然,这两个选项选择哪一个与Ta+Tc−2Tb的值有关。

当n≥4人要过河时,首先采用上述两种方法中较好的一个,送最大的两人过河。 那么问题就变成了:找到最优策略,将剩下的n-2人送过河。 重复这个策略,直到n=2,两个人就可以直接走。

知识点分类:

算法-基本算法-贪心法

答案分析:

本题有4个人(假设a、b、c、d)过河。 由题可知,过河次数为Ta=1,Tb=2,Tc=4,Td=8。

通过背景知识分析可知,选择哪种过河序列是由t1-t2的值决定的。 计算t1-t2=Ta+Tc-2Tb=1+4-2*2=1>0

所以选择第二个过河顺序。 ab、a(b)、cd、b(a)、ab所需时间为:Ta+3*Tb+Td=1+3*2+8=15,所以正确答案应该是B。

真题解析16

#include 
using namespace std;
int n;int a[1000];
int f(int x)
{    int ret = 0;
    for (; x; x &=x-1) ret++;
    return ret;
 }
  int g(int x)
 {
     return x & -x;
 }
  int main()
 {
     cin >> n;
     for (int i = 0; i < n; i++)
 cin >> a[i];
     for (int i = 0; i < n; i++)
         cout << f(a[i]) + g(a[i]) << '';
     cout << endl;
     return 0;
 }

16、当输入n等于1001时,程序不会导致下标越界( )。

注:第16-20题为阅读程序题型中的判断题,第21题为阅读程序题型中的选择题。

分析:

背景知识:

数组是相同数据类型的元素的集合。 定义数组时,需要指定元素的类型、数组名称以及数组包含的元素数量。

数组定义

语法格式为:

数组类型数组名[常量表达式];

例如:int book[100];

数组类型是数组中元素的数据类型,数组名是表示数组首地址的符号常量,常量表达式是数组中元素的个数,数组下标从0开始。

数组存储

通过添加数组名和下标值即可访问数组中对应的元素。 下标值从0开始。对于n个元素的一维数组,下标值的范围是0到n-1。

数组越界

给数组元素赋值或者引用数组元素时,一定要注意下标值不能超出数组定义的范围,否则数组就会越界。

知识点分类:

C++编程-数组-数组定义、数组和数组下标的含义

答案分析:

首先分析一下问题中给出的代码:

#include 
using namespace std;
int n;//定义数组中元素的个数
int a[1000];//定义一个可以存储1000个元素的数组a 
int f(int x)  //定义函数f,对x与x-1循环做位运算,并返回循环执行的次数
 {
    int ret = 0;
    for (; x; x &=x-1) ret++;
    return ret;
 }
  int g(int x) //定义函数g,返回x与-x做位运算的值
 { 
    return x & -x;
 } 
int main( )
 { 
 cin >> n;   //输入数组元素的个数  
 for (int i = 0; i < n; i++)   cin >> a[i];//初始化数组a 
 for (int i = 0; i < n; i++)   //对数组的每个元素调用函数f和g,将结果相加并输出   
    cout <
  cout << endl;
  return 0;
}

代码第5行定义数组的元素个数为1000,因此数组的下标取值范围为0-999。

当输入n等于1001、1001>999时,程序就会出现下标越界。 因此,本题的描述是错误的,应在括号内打×号。

真题解析17

#include 
using namespace std;
int n;
int a[1000];
int f(int x)
{
    int ret = 0;
    for (; x; x &=x-1) ret++; 
   return ret;
 }
  int g(int x)
 { 
    return x & -x;
 } 
 int main()
 {  
   cin >> n; 
    for (int i = 0; i < n; i++)
 cin >> a[i];
     for (int i = 0; i < n; i++) 
        cout << f(a[i]) + g(a[i]) << ''; 
    cout << endl; 
    return 0;
 }

17、输入a[i]必须全部为正整数,否则程序会陷入死循环。 ( )

注:第16-20题为阅读程序题型中的判断题,第21题为阅读程序题型中的选择题。

分析:

背景知识:

位运算:

任何信息在计算机中都以二进制表示。 数据在计算机中以二进制补码形式存储。 位运算是直接对内存中整数的二进制位进行操作。 根据NOI大纲,入门级需要掌握的位运算包括AND(&)、OR(|)、NOT(~)、XOR(^)、左移()。

知识点分类:

C++编程-基本运算-位运算

答案分析:

首先分析一下问题中给出的代码:

#include 
using namespace std;
int n;//定义数组中元素的个数
int a[1000];//定义一个可以存储1000个元素的数组a 
int f(int x)  //定义函数f,对x与x-1循环做位运算,并返回循环执行的次数 
{
    int ret = 0; 
   for (; x; x &=x-1) ret++;
    return ret;
 }
  int g(int x) //定义函数g,返回x与-x做位运算的值 
{
     return x & -x;
 } 
int main( ) 
{
  cin >> n;   //输入数组元素的个数  
 for (int i = 0; i < n; i++) 
  cin >> a[i];//初始化数组a 
 for (int i = 0; i < n; i++)   //对数组的每个元素调用函数f和g,将结果相加并输出    
   cout <
  cout << endl;
  return 0;
}

根据背景知识中关于按位运算的介绍,负数也可以进行按位运算,所以这道题的描述是错误的,括号里应该打个×。

真题解析18

18. 输入“5 2 11 9 16 10”时,输出为“3 4 3 17 5”。 ( )

注:第16-20题为阅读程序题型中的判断题,第21题为阅读程序题型中的选择题。

分析:

背景知识:

位运算规则:

AND (&):只有当两位都为 1 时,结果才为 1

或(|):只有当两位都为0时,结果才为0

非(~):0变1、1变0

异或(^):如果两个位相同,则值为 0,如果不同,则值为 1。

知识点分类:

C++编程-基本运算-位运算

答案分析:

首先分析一下问题中给出的代码:

函数f(x)的具体计算过程请参考下表:

函数g(x)的具体计算过程请参考下表:

从表中我们可以看到程序最终的输出为: 3 4 3 17 4

您还可以通过编译并运行程序来验证它:

我们输入:5 2 11 9 16 10,我们可以看到输出是:3 4 3 17 4。

题目给出的输出结果是“3 4 3 17 5”,所以这题的描述是错误的,括号里应该打×。

真题解析19

19. 当输入为“1”时,输出为“18”。 ()

注:第16-20题为阅读程序题型中的判断题,第21题为阅读程序题型中的选择题。

分析:

背景知识:

位运算规则:

AND (&):只有两位都为 1 时结果才为 1

或(|):只有当两位都为0时,结果才为0

非(~):0变1、1变0

异或(^):如果两个位相同,则值为 0,如果不同,则值为 1。

计数算法:计算二进制数中1的个数。 根据第18题的分析计算,我们可以看出,本题中的f函数实现了Count算法,统计二进制数中1的个数。

功能:计算一个二进制数中最低的1对应的值。 根据第18题的分析计算可以看出,本题中的g函数实现了函数的功能,就是计算一个二进制数中最低的1对应的值。

知识点分类:

C++编程-基本运算-位运算

答案分析:

首先分析一下问题中给出的代码:

我们将输入的十进制数转换为二进制数,得到:

1 1111 110

基于背景知识的分析

f(x)是统计二进制数中1的个数,所以f(x)=16;

g(x)是计算二进制数中最低位1对应的值,即计算0 0000 010的值,所以g(x)=2

f(x)+g(x)=16 + 2 =18

您还可以通过编译并运行程序来验证它:

本题给出的输出结果是“18”,所以本题的描述是正确的,括号内打√。

真题解析20

20、将源代码中g函数的定义(第13-16行)移到main函数后面,程序就可以正常编译运行。 ( )

注:第16-20题为阅读程序题型中的判断题,第21题为阅读程序题型中的选择题。

分析:

背景知识:

函数定义:

返回类型函数名([参数列表])

函数体//执行语句

包括以下部分:

函数名称:为函数指定的名称必须是有效的 C++ 标识符。 命名变量的规则也适用于命名函数,但要注意 C++ 保留字不能用作函数名。

函数参数:包括形参和实参。

形式参数是以逗号分隔的变量描述列表。 这些变量称为函数的形式参数。 形式参数用于接收从函数调用者传递给该函数的数据。

实际参数是一个以逗号分隔的表达式列表,每个表达式称为一个实际参数。 调用函数时,需要将实参的值传递给相应位置的形参,因此它们两个参数的个数必须相同,数据类型也必须匹配。

函数体:函数体是由大括号{}分隔的一系列语句,分为描述部分和语句部分,用于描述该函数要执行的操作。 描述部分用于描述函数中使用的变量和函数。 语句部分由基本语句组成,函数的功能是通过函数体内各语句的执行来实现的。

例如在这个问题中:

返回类型:函数可以将值发送回调用它的程序模块。 返回类型是发送回的值的数据类型。 语法为:表达式;

函数调用:

定义一个函数后,程序中的其他函数就可以使用该函数。 这个使用过程称​​为函数调用。

函数名称(实参列表);

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码

  • 我要关灯
    我要开灯
  • 返回顶部