当前位置: 首页 > news >正文

2024届 C++ 刷题 笔试强训 Day 03

选择题

01

以下程序的输出结果是()

#include <stdio.h>
void main()
{char a[10] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 0}, *p;int i;i = 8;p = a + i;printf("%s\n", p - 3);
}

A 6
B 6789
C ‘6’
D 789


题目解析:

  • 题目中定义了一个字符数组和字符类型的指针 p。数组名 a 表示数组首元素地址,p = a + 8 说明 p 指向的是数组中下标为 8 的元素。
  • 以字符串的形式打印 p-3 地址为起始的内容。首先 p - 3 指向的是下标为 5 的元素,也就是 6;以字符串的形式打印,知道遇到 \0 才会停止,字符 \0 对应的 ASCII 码就是 0 哈!

答案:B


知识点总结:

  • 数组名代表数组首元素的地址。但在 &数组名 以及 sizeof 数组名 的时候,数组名表示的是整个数组。
  • %s 的形式打印,会向后打印字符,直到遇到 \0

02

以下程序的输出结果是()

#include <iostream>
using namespace std;
int main()
{int x = 3, y = 3;switch (x % 2){case 1:switch (y){case 0:cout << "first";case 1:cout << "second";break;default:cout << "hello";}case 2:cout << "third";}return 0;
}

A second third
B hello
C first second
D hellothird


题目解析:

  • 首先进入第一层 switchx % 2 的值为 1,进入 case 1:;y 的值为 3 进入 default 此时会输出 hello
  • 执行完 case 1 之后,我们发现并没有 break 语句,那么就会进入 case 2 继续执行,然后输出 third

答案:D


知识点总结:

  • 理解 switch 语句的执行原理:

    switch语句中的表达式与某个case标签的值匹配时,程序会执行该case下的代码。如果在这个case的代码块中没有遇到break语句,那么程序会继续执行下一个case的代码块,这种行为称为“贯穿”。

    这个过程会一直持续下去,直到遇到break语句或者执行完所有的case。如果在switch语句的末尾有一个default标签,且之前没有遇到break语句,那么程序还会执行default标签下的代码。

03

以下能对二维数组a进行正确初始化的语句是()

A int ta[2][]={{0,1,2},{3,4,5}};
B int ta[][3]={{0,1,2},{3,4,5}};
C int ta[2][4]={{0,1,2},{3,4},{5}};
D int ta[][3]={{0,2},{},{3,4,5}};


题目解析:

  • A:定义二维数组的时候,行数可以不指定,当时列数必须指定。A 错误。

  • B:定义二维数组,行数可以不指定,B 选项中只初始化了两行数据,那么 ta 变量实际上就是:ta[2][3]。当不指定行数会根据你的初始化推导。

    因此,如果不指定行数,就必须在定义的时候初始化数组,不然编译器没法给你的数组开辟空间,就会报错。B 正确

  • C:这个选项显然是错误的,二维数组定义了两行,却初始化了三行的数据,越界访问。

  • D:初始化第一行的时候 {0,,2} 试图跳过一个元素的初始化也是不合法的。D 错误。

答案:B


知识点总结:

  • 二维数组定义的时候可以不指定行数。如果不指定行数就必须显示初始化。
  • 二维数组定义的时候不可以不指定列数。
  • 数组部分初始化元素时,未显示初始化的部分会补零。

04

能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是()

A return这二个数
B 形参用数组
C 形参用二个指针
D 用二个全局变量


题目解析:

  • return 返回的话,只能返回一个数哈,显然不能返回函数中的两个数据。

答案:A


知识点总结:

将函数内的局部变量带出函数的作用域的方法:

  1. 形参使用数组。因为数组就是传递地址的嘛,就类似指针的效果。因此形参使用数组和使用指针是相同的效果。
  2. 全局变量。全局变量自然不用说,因为他的作用域是在全局和声明周期是随进程的,能够轻易做到。
  3. 通过返回值。通过返回值也能将函数内部的数据带出来,如果需要返回多个数据,可以使用结构体。但是返回值的本质其实是拷贝嘛,效率自然没有指针高,因此,更加推荐使用指针哈!

05

int *p[4] 与选择项中的() 等价

A int p[4]
B int *p
C int *(p[4])
D int (*p)[4]


题目解析:

首先题目表示的是指针数组哈!指针的类型是 int

  • A:选项 A 表示的是一个 int 类型的数组。
  • B:选项 B 表示的是一个 int 类型的指针。
  • C:选项 C 和题目是一个意思哈,这个括号加不加一个效果。
  • D:选项 D 表示的是一个数组指针哈,该指针指向的数组是:有四个元素的 int 类型的数组。

知识点总结:

熟练掌握各种类型指针的书写方法。

  1. 普通指针:指向特定数据类型的指针。例如,int *ptr; 定义了一个指向整数的指针。
  2. 空指针:不指向任何地方的指针。例如,int *ptr = NULL; 将指针设置为 NULL。
  3. 野指针:指向未知内存地址的指针,应尽量避免使用。例如,未初始化的指针。
  4. 指向指针的指针:也称为二级指针。例如,int **ptr; 定义了一个指向整型指针的指针。
  5. 指针数组:一个数组,其中的每个元素都是指针。例如,int *ptrArray[5]; 定义了一个包含5个整型指针的数组。
  6. 数组指针:指向数组的指针。例如,int (*ptr)[5]; 定义了一个指向包含5个整数的数组的指针。
  7. 函数指针:指向函数的指针。例如,int (*funcPtr)(int, int); 定义了一个指向接受两个整数参数并返回整数的函数的指针。
  8. 常量指针:指针指向的值不能被修改。例如,const int *ptr; 定义了一个指向整数常量的指针。
  9. 指针常量:指针本身的值不能被修改。例如,int *const ptr; 定义了一个指向整数的常量指针

06

设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是()

A n=0;while(ch=getchar()!=‘\n’)n++;

B n=0;while(getchar()!=‘\n’)n++;
C for(n=0;getchar()!=‘\n’;n++);
D n=0;for(ch=getchar();ch!=‘\n’;n++);


题目解析:

D:在 for 循环中,第一个分号前面的表示循环条件的初始化,也就是说,D 选项仅仅会输入一次!如果这次输入的字符不是 \n 循条件就会一直判断成立,从而陷入死循环。

答案:D


知识点总结:

  • getchar 函数用于向标准输入读取一个字符,返回值是读到字符的 ASCII 码。

07

以下代码

char *ptr;
char myString[] = "abcdefg";
ptr = myString;
ptr += 5;

代码执行之后ptr指向的内容是?

A Compiler error
B fg
C efg
D defg


题目解析:

第一行定义了一个 char* 的指针变量 ptr。第二行定义了一个字符数组。第三行将数组赋值给 ptr 这个指针变量。第四行将 ptr += 5 那么 ptr 将指向字符数组下标为 5 的元素。因为 ptr 本身是一个字符指针,结合题目选项,他应该指向的是一个字符串,因此就是 fg

答案:B


知识点总结:

  • 使用字符串常量初始化一个字符数组,其实就是将字符串常量中的每个字符拷贝到栈空间,然后用来初始化定义的数组。在本题中数组的等价定义为:char myString[8] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', '\0'};
  • 字符串在 C/C++ 中以字符 \0 结尾。

08

下面3段程序代码的效果一样吗()

int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;

A (2)=(3)
B (1)=(3)
C (1)=(2)
D 都不一样


题目解析:

const 修饰指针变量无非三种情况:

  1. 指针变量本身不可改变。例如:int * const a
  2. 指针变量指向的内容不可以改变。例如:const int* a 或者 const int *a
  3. 指针变量本身和指向的内容都不可以改变。例如:const int * const a

答案:C


知识点总结:

  • 看是哪种情况其实只要看 const* 的左边还是在 * 的右边哈!
  • 如果 const 在 * 的左边,那么就是指针指向的内容不可变。
  • 如果 const 在 * 的右边,那么就是指针本身不可以改变。

09

32位系统中,定义int **a[3][4],则变量占用内存空间为()

A 4
B 48
C 192
D 12


题目解析:

32 位系统下,指针变量是 4 个字节。a 数组一共是 12 个元素,因此总大小就是 48 个字节。

答案:B


知识点总结:

  • 在32位系统中,指针变量的大小为 4 字节,这主要是因为 32 位系统的地址总线宽度为32位。地址总线负责在CPU与内存之间传递地址信息,其宽度决定了CPU可以寻址的最大内存范围。

    在32位系统中,地址总线的32位可以表示2^32个不同的地址,即最多可以寻址4GB的内存。由于每个地址都需要一个唯一的标识,因此需要一个足够大的空间来存储这些地址。在大多数情况下,一个字节(Byte)由8位(bit)组成,所以32位需要4个字节(4 * 8 = 32)来存储。

  • 可以看到,指针变量的大小与是什么类型的指针是没有关系的。与系统有关。

编程题

01

原题链接:`https://www.nowcoder.com/practice/bd891093881d4ddf9e56e7cc8416562d?tpId=85&&tqId=29864&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking)

题目描述:

读入一个字符串str,输出字符串str中的连续最长的数字串。


解题思路:

遍历字符串,使用cur去记录连续的数字串,如果遇到不是数字字符,则表示一个连续的数字串结束了,则将数字串跟之前的数字串比较,如果更长,则更新更长的数字串更新到res。

可以用双指针,但是没必要!因为题目的数据范围很小。


完整代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{string str, res, cur;cin >> str;for (int i = 0; i <= str.length(); i++){// 数字+=到curif (str[i] >= '0' && str[i] <= '9'){cur += str[i];}else{// 找出更长的字符串,则更新字符串if (res.size() < cur.size())res = cur;elsecur.clear();}}cout << res;return 0;
}

02

原题链接:https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述:

给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

数据范围: n ≤ 50000 n≤50000 n50000,数组中元素的值 0 ≤ v a l ≤ 10000 0≤val≤10000 0val10000

要求:空间复杂度: O ( 1 ) O(1) O(1),时间复杂度: O ( n ) O(n) O(n)


题目解析:

  • 思路一:数组排序后,如果符合条件的数存在,则一定是数组中间那个数。这种方法虽然容易理解,但由于涉及到快排sort,其时间复杂度为O(NlogN)并非最优;

  • 思路二:众数:就是出现次数超过数组长度一半的那个数字。如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。

我们这里只写第二种思路的代码哈:


完整代码:

class Solution
{
public:int MoreThanHalfNum_Solution(vector<int> numbers){if (numbers.empty())return 0;// 遍历每个元素,并记录次数;若与前一个元素相同,则次数加1,否则次数减1int result = numbers[0];int times = 1; // 次数for (int i = 1; i < numbers.size(); ++i){if (times != 0){if (numbers[i] == result){++times;}else{--times;}}else{result = numbers[i];times = 1;}}// 判断result是否符合条件,即出现次数大于数组长度的一半times = 0;for (int i = 0; i < numbers.size(); ++i){if (numbers[i] == result)++times;}return (times > numbers.size() / 2) ? result : 0;}
};

相关文章:

2024届 C++ 刷题 笔试强训 Day 03

选择题 01 以下程序的输出结果是&#xff08;&#xff09; #include <stdio.h> void main() {char a[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, *p;int i;i 8;p a i;printf("%s\n", p - 3); }A 6 B 6789 C ‘6’ D 789 题目解析&#xff1a; 题目中定义了一个…...

linux用git拉取我云端以及git处理冲突

拉取后切换一个跟云端分支(dev)一样的 git branch --set-upstream-toorigin/dev dev 之后就同步了 A在dev分支写了iii,提交 B在dev分支写了hhh,提交,冲突 怎么修改,B把云端的拉下来,随便改改就行...

Learn OpenGL 17 立方体贴图

立方体贴图 我们已经使用2D纹理很长时间了&#xff0c;但除此之外仍有更多的纹理类型等着我们探索。在本节中&#xff0c;我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型&#xff1a;立方体贴图(Cube Map)。 简单来说&#xff0c;立方体贴图就是一个包含了…...

【四 (6)数据可视化之 Grafana安装、页面介绍、图表配置】

目录 文章导航一、Grafana介绍[✨ 特性]二、安装和配置1、安装2、权限配置&#xff08;账户/团队/用户&#xff09;①用户管理②团队管理③账户管理④看板权限 3、首选项配置4、插件管理①数据源插件②图表插件③应用插件④插件安装方式一⑤安装方式二 三、数据源管理1、添加数…...

jvm 堆

Java虚拟机&#xff08;JVM&#xff09;中的堆是运行时数据区的一个主要部分&#xff0c;它用于存放对象实例和数组。它是所有Java线程共享的一块内存区域&#xff0c;是垃圾收集器管理的主要区域&#xff0c;因此也被称作垃圾收集堆&#xff08;Garbage-Collected Heap&#x…...

Jenkins通知目标服务器拉取Harbor镜像部署

1.告诉目标服务器拉取哪个镜像 2.判断当前有没有正在运行此容器&#xff0c;有就删除 3.接着查看拉取的镜像目标服务器上是否已存在&#xff0c;有就删除 4.拉取Harbor镜像 5.运行容器 目标服务器编写脚本 创建个部署脚本 vim deploy.sh告诉目标服务器Harbor地址、仓库、镜像…...

Android 13.0 系统中framework中关于Activitity的生命周期的源码讲解

1.前言 在13.0的系统rom定制化开发中,在framework中对activitity的生命周期的掌握和了解也是非常重要的,这样有利于在启动某个app的activity的页面的时候,可以 监听到是在启动 resume stop的过程,也好进行相关的功能开发,接下来就分析下Activity的相关生命周期的代码 2.…...

常见的几个Python技术难题

大家在日常开发中有没有遇到一些难题呢&#xff1f;计划后面出几期专题针对性的解决。大家如果有其它问题可以在评论区给出哈。 以下是几个Python技术难题的例子&#xff1a; 并发和多线程编程&#xff1a;Python的全局解释器锁&#xff08;GIL&#xff09;限制了多线程的并行…...

【探索Linux】—— 强大的命令行工具 P.28(网络编程套接字 —— 简单的UDP网络程序模拟实现)

阅读导航 引言一、UDP协议二、UDP网络程序模拟实现1. 预备代码⭕makefile文件⭕打印日志文件⭕打开指定的终端设备文件&#xff0c;并将其作为标准错误输出的目标文件描述符 2. UDP 服务器端实现&#xff08;UdpServer.hpp&#xff09;3. UDP 客户端实现&#xff08;main函数&a…...

【MATLAB源码-第165期】基于matlab的科莫多巨蜥算法(KMA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 科莫多巨蜥算法&#xff08;Komodo Mlipir Algorithm&#xff0c;简称KMA&#xff09;是一种受到印尼科莫多岛上独特生物——科莫多巨蜥启发的创新算法。尽管这个算法的名称听起来很有趣&#xff0c;但实际上它并不是一个公认…...

【Linux】项目部署CPU彪高如何定位

1.查看所有CPU占比 使用top指令获取彪高进程的PID 2.输出进程的信息 ps H -eo pid,tid,%cpu | grep 1313 3.查看线程的信息 jstack tid nid都是十六进制的 4.进制转换 将 tid的十进制转为十六进制 找到nid 可以定位到具体位置 5.关闭程序 ps -ef | grep java kill -9 jav…...

第十二届蓝桥杯大赛软件赛决赛C/C++ 研究生组-纯质数

直接判断数据过大 相对而言&#xff0c;由2&#xff0c;3&#xff0c;5&#xff0c;7组成的数更少&#xff0c;则先筛选出由2,3,5,7组成的数&#xff0c;再判断这些数中的质数个数即可 #include <iostream> using namespace std; int main() {printf("1903");…...

MyBatis面试简答题

以下是一份MyBatis的高难度简答题,共20题: 请解释MyBatis中#{}和${}的区别,并举例说明它们在实际应用中的使用场景。 MyBatis的Mapper接口是如何与XML映射文件关联的? 如何在MyBatis中实现动态SQL?请列举几种常见的动态SQL元素并解释其作用。 描述MyBatis中的ResultMap的作…...

lua 中的元表

a{ age0, __tostringfunction() { }, __callfunction() { }, } b{} a.__indexa{}//将a表中的__index指向自己 setmetatable(a,b)//将b设置为a的元表&#xff1b; __tostring 当子表a被当做字符串使用时会调用原表b中的__tostring方法, __call 当子表a被当做字符串使用时…...

c语言综合练习题

1.编写程序实现键盘输入一个学生的学分绩点 score&#xff08;合法的范围为:1.0—5.0&#xff09;&#xff0c;根据学生的学分绩点判定该学 生的奖学金的等级&#xff0c;判定规则如下表所示。 #include <stdio.h>int main() {float score;printf("请输入学生的学分…...

相机拍照与摄影学基础

1.相机拍照 相机可能形状和大小不同&#xff0c;但基本功能相同&#xff0c;包括快门速度、光圈和感光度&#xff0c;这些是摄影的通用概念。即使是一次性相机也是基于这三个理念工作的。不同类型相机在这三个概念上的唯一区别是你可以控制这些功能的程度。这三个参数被称为相…...

Pytorch:torch.cuda.empty_cache()

torch.cuda.empty_cache() 原理 torch.cuda.empty_cache() 是PyTorch中用来释放未被分配的缓存的内存的函数。在使用GPU进行计算时&#xff0c;CUDA会在内部维护一个内存缓存池&#xff0c;以便更快地分配和释放。但有时候&#xff0c;这些缓存的内存在不再需要的时候&#x…...

Linux--gdb调试

一.安装gdb sudo apt install gdb 二.使用gdb 三.gdb的相关操作 gdb 可执行文件名 显示代码: l 加断点: b 行号 启动程序:r(运行之前一定要加断点) 查看断点信息: info break/info b 删除断点信息:delete 断点编号 单步执行:n 打印 :p 显示:display 变量名: 退出:q …...

JavaSE(上)-Day6

JavaSE&#xff08;上&#xff09;-Day6 数组数组的定义数组的初始化打印数组分析数组索引数组内存图 方法方法的定义和调用方法的重载方法的内存图 二维数组二位数组的创建和初始化二维数组的内存图 数组 1.数组是一种容器&#xff0c;可以一次存储多个相同类型的数据 数组的…...

(二十五)Flask之MTVMVC架构模式Demo【重点:原生session使用及易错点!】

目录&#xff1a; 每篇前言&#xff1a;MTV&MVC构建一个基于MTV模式的Demo项目&#xff1a;蹦出一个问题&#xff1a; 每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...