【C++刷题集】-- day3

news/2025/2/22 16:01:56/

目录

选择题

单选

OR59 字符串中找出连续最长的数字串⭐

【题目解析】

【解题思路】

JZ39 数组中出现次数超过一半的数字⭐

【题目解析】

【解题思路1】

【解题思路2】


选择题

单选

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

#include <stdio.h>
int 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);return 0;
}
6
6789
'6'
789

正确答案:


解析:

  • %s:格式化打印是遇见 '\0'(0) 才会停止打印。

----------------------------------------------

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

#include <iostream.h>
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;
}
second third
hello
first second
hellothird

正确答案:


解析:

        根据x % 2 = 1匹配 case 1: ,根据y = 3匹配 default: ,于是会打印 "hello" 。但是此处我们需要注意,外层的switch语句的case : 是没有 break; 语句的,所以其会继续向下执行,然后执行case 2: ,再打印 "third" 。

        没有 break; 语句会一直执行到 break; 语句为止 / 结束。

----------------------------------------------

3、 以下能对二维数组a进行正确初始化的语句是 ( )
int a[2][] = {{0,1,2},{3,4,5}};
int a[][3] = {{0,1,2},{3,4,5}};
int a[2][4] = {{0,1,2},{3,4},{5}};
int a[][3] = {{0,,2},{},{3,4,5}};

正确答案:


解析:

二维数组再声明的时候,行可以省略,列是不可以省略的。

:声明的是两行,但是初始化的时候,初始化的是三行。

:初始化每一行的时候,必须连续的初始化,中间不能间隔。

----------------------------------------------

4、 能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是 ( ) 
return这二个数
形参用数组
形参用二个指针
用二个全局变量

正确答案:


解析:

return 每一次只能 return 一个数据类型,多个除非放到一个数组 / 一个容器里面。

用数组的话,在调用这个函数的时候需要传递数组的地址,然后将函数处理的结果,放到这个数组中,然后函数调用完之后,就可以通过主调函数去访问数组来获取处理结果。

用指针的话,在调用这个函数的时候需要传递两个地址变量,然后将对应的处理结果,放到地址的所属空间中,然后在函数调用完之后,主调函数通过两个指针去访问所属空间的值。

全局变量的作用域是在整个源文件都是有效的,所以主调函数可以对其访问,以获取处理结果。

----------------------------------------------

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

正确答案:


解析:

  • 题int *p[4]:[]的优先级是高于*的,所以p先和[]进行结合表示其是一个数组,然后数组里面存储的是int类型的指针 —— int类型的指针数组,元素个数为4

int p[4]:int类型的数组,元素个数为4

int *p:int类型的指针数组

int *(p[4]):此时[]的优先级是高于*的,int类型的指针数组,元素个数为4

int (*p)[4]:此时*的优先级是高于[]的,数组指针,元素个数为4,int类型

----------------------------------------------

6、 设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是
n=0; while(ch=getchar()!='\n') n++;
n=0; while(getchar()!='\n') n++;
for(n=0; getchar()!='\n'; n++);
n=0; for(ch=getchar(); ch!='\n'; n++);

正确答案:


解析:

while(ch=getchar()!='\n'):先getchar()获取一个字符,然后由于 != 优先级高于 '\n' ,所以,先进行 getchar()!='\n' 后再执行 ch = (getchar()!='\n'),虽然ch存在很奇怪,但是能计算。

操作符优先级(详细说明+表格+问题表达式)_川入的博客-CSDN博客

while(getchar()!='\n'):的简易版,能实现。

for(n=0; getchar()!='\n'; n++):getchar()!='\n' 作为判断条件,此可以理解为与效果一样,能实现。

for(ch=getchar(); ch!='\n'; n++):ch=getchar() 作为初始化部分,只有最开始的时候才会执行一次,所以是无法实现的,并且如果输入的第一个字符不是 '\n' 将会死循环。

----------------------------------------------

7、 以下代码
char* ptr;
char myString[] = "abcdefg";
ptr = myString;
ptr += 5;
代码执行之后ptr指向的内容是?
Compiler error
fg
efg
defg

正确答案:


解析:

        因为p指向的类型是char类型的。

----------------------------------------------

8、 下面3段程序代码的效果一样吗()
int b;
(1)const int* a = &b;
(2)int const* a = &b;
(3)int* const a = &b;
(2)=(3)
(1)=(3)
(1)=(2)
都不一样

正确答案:


解析:

  • 常量指针:指针所指空间的值是不能发生改变的,不能通过指针解引用修改指针所指向的空间的值,但是指针的指向是可以发生改变的。
  • 指针常量:指针本身是一个常量,指针的指向不能发生改变,但是指针所指空间的值是可以发生的,可以通过指针解引用改变指针所指空间的值。
  • 区分:const与*的相对位置
    • const在*的左边 -- 常量指针
    • const在*的右边 -- 指针常量

(1)常量指针

(2)常量指针

(3)指针常量

----------------------------------------------

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

正确答案:


解析

        三行四列的一个数组,一共有 3 * 4 = 12 个元素。每一个元素都是int的二位指针类型,指针类型在32位系统中,是4个字节,于是:12 * 4 = 48。

----------------------------------------------

10、 假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?
#include <stdio.h>
int main() {long long a = 1, b = 2, c = 3;printf("%d %d %d\n", a, b, c);return 0;
}
1,2,3
1,0,2
1,3,2
3,2,1

正确答案:


解析:

  • 大端:低位存高地址,高位存低地址。
  • 小段:高位存高地址,低位存低地址。

 C语言整数存储_大小端_川入的博客-CSDN博客

看题:

        long long类型是占8个字节,32 位 little endian 的机器。

        利用printf函数打印这三个变量的值,printf是一个库函数,在调用的时候,会创建一个函数栈帧。(栈:高地址向低地址增长)

        调用printf函数的时候,变量是从右到左入栈的(先c,再b,再a)。

        然后利用 %d 进行打印,每次获取4个字节内存的数据,然后根据后进先出的原则,依次向后4个字节,以转化为十进制打印。

        所以输出为:1 0 2

----------------------------------------------

OR59 字符串中找出连续最长的数字串

字符串中找出连续最长的数字串_牛客题霸_牛客网 (nowcoder.com)

【题目解析】

        本题是一个很简单的题目,这里就不解析了。

【解题思路】

        遍历字符串,使用str_tmp临时记录出现的数字片段,使用str_ret记录str_tmp临时出现的最长数字片段,最后返回str_ret。
#include <iostream>
#include <string>
using namespace std;int main() {string str;cin >> str;string str_ret;string str_tmp;for(auto ch : str){if(ch <= '9' && ch >= '0')str_tmp.push_back(ch);else{if(str_tmp.size() > str_ret.size()) str_ret = str_tmp;str_tmp.clear();}}if(str_tmp.size() > str_ret.size()) str_ret = str_tmp;cout << str_ret << endl;
}

JZ39 数组中出现次数超过一半的数字

数组中出现次数超过一半的数字_牛客题霸_牛客网 (nowcoder.com)

【题目解析】

        本题题意很简单,需要找出超过一半的那个数字,需要注意这个题是一个往年面试的热门题型。

【解题思路1】

        数组排序后,如果符合条件的数存在,则一定是数组中间那个数。这种方法虽然容易理解,但由于涉及到快排sort,其时间复杂度为O(NlogN)并非最优。
class Solution {
public:int MoreThanHalfNum_Solution(vector<int> numbers) {if(numbers.empty()) return 0;sort(numbers.begin(), numbers.end());return numbers[numbers.size() / 2];}
};

【解题思路2】

        众数:就是出现次数超过数组长度一半的那个数字,如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数。
class Solution {public:int MoreThanHalfNum_Solution(vector<int> numbers) {int result = numbers[0];int times = 1;int i = 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;}}return result;}
};

/


http://www.ppmy.cn/news/79042.html

相关文章

CodeForces.1786A2.发牌.[中等][flg标识][数学规律][双色牌]

题目描述&#xff1a; 题目解读&#xff1a; 发牌问题&#xff0c;给两人发双色牌&#xff0c;同样还是 给a发1张&#xff0c;然后给b发2&#xff0c;3张&#xff1b; 给a发4&#xff0c;5张&#xff0c;给b发6&#xff0c;7张&#xff1b; 给a发8&#xff0c;9张&#xff…

mac 切换java jdk版本 java8 java11

1. 终端执行命令 查看本地各版本jdk&#xff1a;mac通常默认安装了jdk1.8 安装目录是 /Library/Java/JavaVirtualMachines/ cd /Library/Java/JavaVirtualMachines/ ls 2. 上述命令列出的各版本目录名 后&#xff0c;在全局配置文件.bash_profile中新增上面命令列出的各…

分布式事务解决方案-Seata

分布式事务解决方案-Seata 1.分布式事务问题1.1.本地事务1.2.分布式事务1.3.演示分布式事务问题 2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2.1.3.分区容错2.1.4.矛盾 2.2.BASE理论2.3.解决分布式事务的思路 3.初识Seata3.1.Seata的架构3.2.部署TC服务3.3.微服务集成Seata…

3.fabric二进制工具包介绍

(1)Fabric二进制工具包: Fabric二进制工具包:Fabric二进制工具包(Fabric Binary Distribution)是Hyperledger Fabric的核心组件,它包含了一系列可执行的二进制文件,用于搭建、管理和操作Fabric网络。该工具包提供了一套命令行工具,可以执行各种与Fabric网络相关的任务…

5月24日,今日信息差

1、618期间&#xff0c;消费者在淘宝App搜索Apple相关产品&#xff0c;点击有“地址绿标”商品下单购买&#xff0c;最快1小时即可收到相关产品。预计会有60商家1000多款商品支持同城门店发货&#xff0c;覆盖了日立、海信、美的、OPPO、vivo、联想等品牌 2、联想智能手机业务…

第五章 资本主义的发展及趋势

一. 单选题 1. (单选题)自由竞争资本主义向垄断资本主义过渡的根源在于( ) A. 资本主义的基本矛盾 2. (单选题)主要资本主义国家相继由自由竞争阶段发展到垄断阶段的时期是( ) C. 19世纪末20世纪初 3. (单选题)垄断的形成是( ) B. 生产集中发展到一定阶段的结果 4. (…

C#调用海康威视CHCNetSDK出现 未能从程序集中加载类型“WIFI_AUTH_PARAM”,因为它在 0 偏移位置处包含一个对象字段...

问题描述&#xff1a; C#在调用海康威视CHCNetSDK出现 未能从程序集中加载类型“WIFI_AUTH_PARAM”&#xff0c;因为它在 0 偏移位置处包含一个对象字段&#xff0c;该字段已由一个非对象字段不正确地对齐或重叠。 解决方案&#xff1a; 需要把整个文件接口体头部的LayoutKi…

牛客小白月赛71

链接&#xff1a;牛客小白月赛71_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ A&#xff1a;猫猫与广告 观察题目&#xff0c;让我们找到一个牌子去遮挡一下另一块牌子&#xff0c;考虑到边对齐&#xff0c;直接进行判断即可&#xff0c;判断的时候记得考虑短边对…