【C++笔试强训】第三天

选择题

image-20230324182546232

解析:字符数组里面的最后一个字符是0,说明里面本身就是一个字符串——"123456789",数组名表示数组首元素的地址,那么p = a + i指向的就是字符数组中元素'9',那么p - 3就是指向元素'6'的地址,%s打印的是字符串,所以从'6'开始向后打印。

解析:本题考查switch和case语句,如果在switchcase语句中没有遇见break,就默认往下继续执行。x%2为1,指向case 1y=3,执行case 3,但是没有就执行defalut,此时输出hello,没有遇见break,继续执行case 2,打印third。即选D。

image-20230324200144123

解析:对于二维数组,可以不指定具体行,但是必须指定具体列,行可以根据初始化自动判断,A选项中没有指定具体的列;C选项,初始化的行数超过预定的值;D选项中两个,之间的{}中没有数,这是语法错误。所以选B。

image-20230324200415032

解析:return只能返回一个值。

image-20230324201417607

解析:本题主要考查指针数组。p先和[]结合,所以选C。A是整形数组;B是指针;C是整形指针数组,存放整型指针的数组;D是数组指针,指向数组的指针,存放数组的地址,p是数组指针变量。

image-20230324201449853

解析:D中ch = getchar()是初始条件,不是判断条件,第一次输入之后ch的值就不会发生改变了,陷入死循环。

image-20230324201500051

解析:数组名是数组首元素的地址,ptr = myString表示ptr指向数组首元素的地址;ptr += 5表示ptr向后移动5个字节,即指向f的地址。所以选B。

image-20230324201516417

解析:考查的constday01中有讲过。(1)中const修饰的是*a,表示的是常量指针;(2)中const修饰的也是*a,也表示常量指针;(3)中const修饰的是a,表示的是指针常量。所以选C。

image-20230324201552909

解析:数组里面有12个元素,每个元素都是指针类型,在32位系统中,指针的大小是4个字节的大小。所以占48个字节的大小。

image-20230324201610799

解析:本题考查小端存储。

小端字节序存储:数据的低位保存在内存的低地址中,数据的高位保存在内存的高地址中。

大端字节序存储:数据的高位保存在内存的低地址中,数据的低位保存在内存的高地址中。

long long类型在内存中占8个字节,而输出的时候是以%d形式,也就是输出的时候读取4个字节,见下图:

image-20230324205529253

编程题

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JG9rFG7C-1680404974946)(https://raw.githubusercontent.com/Niu-Max/typora/main/img/image-20230322171136537.png)]

解析:答案解析和这个一样。设置两个string类s2,s3专门用来存放s1中的数字串,刚开始的时候s2和s3的size都为0,所以第一次遇到数字串直接放入s2中,然后将s2的数字串赋值给s3,再清空s2;当下次遇到数字串时还放入s2中,拿s2的size大小和s3比较,如果比之前的数字串大则赋值给s3新的数字串,如果没有之前的数字串大则直接将s2清空,等待下次重新存放数字串再进行比较。当s1字符串结尾部分为数字串最大时,此时已经跳出循环,还要单独进行一次比较。

#include <iostream>
#include <string>
using namespace std;
int main() {
    string s1;
    cin >> s1;//一个字符串不包含空格所以不用使用getline函数
    string s2;
    string s3;
    for (int i = 0; i < s1.size(); i++)
    {
        if (s1[i] >= '0' && s1[i] <= '9')//如果是数字就加进去
            s2 += s1[i];
        else {//不是数字的时候比较size大小
            if (s2.size() > s3.size()) //当新数字串大时,将其赋给s3
                s3 = s2;
            else
                s2.clear(); //新数字串小时,清空
        }
    }
    if (s2.size() > s3.size())//可能字符串结尾部分的数字串最大,所以还要再次进行比较
        s3 = s2;
    else
        s2.clear();
    cout << s3;//每次都赋值给s3,所以直接输出s3就可以
    return 0;
}

自己写的存在一些问题

1.为什么结束条件用it!=s1.end()不能判断?

2.怎么判断是否需要在最后加上数字?

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s1;
    getline(cin, s1);//输入字符串
    string s2;//记录数字字符串
    string s3;//记录数字字符串
    int count = 0;//用来记录,当新的数字串比s2的size大时,将新的数字串尾插到s3中
    int flag = 0;//用来记录是否需要在最后将s1字符串尾插到较长数字串中
    int flag1 = 0;//记录当flag1 = 0时将连续数字串尾插到s2中,当flag=1时,不对s2做处理
	string::iterator it = s1.begin();//迭代器
    while (it != s1.end())//循环的控制条件
    {
        count = 0;
        string::iterator it1 = it;//记录下次从哪里开始对s3进行尾插
        
        //当*it为数字时进入循环,注意这里的条件不能设置为it != s1.end(),会报错,具体原因未知,所以设置为it != s1.end()-1 ,在后面再对最后一个字符进行处理
        while (it != s1.end()-1  && (*it >= '0' && *it <= '9')) 
        {
            count++;
            if (flag1 == 0) //第一次对s2进行处理
                s2.push_back(*it); //尾插
            it++; //向后进行处理
        }
        if (s2.size() > 0) //当对s2进行处理之后,flag1 = 1
            flag1 = 1;
        
        //?那假如s3已经有数字串,且比s2大,那么每次都将覆盖上次s3的数字,所以最好加上it - it1 > s3.size(),但是加上之后就不能根据flag =1 判断最后是不是要加字符串中最后一个数字,所以此处有bug
        if(count > s2.size()  ) //判断当count大于s2.size()时,将数字串插入s3
        {
            s3.clear();//每次对s3处理之前将s3中之前的内容清空
            while (count > 0) {
                s3.push_back(*it1); //从it1记录的地方开始插入
                count--; //一共插入count个数据
                it1++;
            }
            //abcd12345ed125ss123 中当s2为12345时,如果不在最后加一个条件判断是否需要将最后一个数字字符加上,会出现结果为123453的情况,而当设置了一个flag条件时,当flag不满足条件时,不需要将最后一个数字字符加上。
            flag = 1;//当对s3处理说明有比s2更长的数字串,且在s2数字串的后面
            
        }
        it++;//向后判断
    }
    if (s2.size() > s3.size()) { //判断谁大
        if ((*(it - 1) >= '0' && *(it - 1) <= '9') && flag == 1 ) { //判断是否需要加上最后一个数字
            s2.push_back(*(it - 1));
        }
        cout << s2;
    }
    else {
        if (*(it - 1) >= '0' && *(it - 1) <= '9' && flag == 1) {
            s3.push_back(*(it - 1));
        }
    cout << s3;
    }
    return 0;
}

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

image-20230322204519522

解析:要找出在数组中出现次数超过数组长度的一半,那么利用sort函数将数组排序后中间的数据就是要找的数据,我们再对数组进行遍历确认是否超过数组长度一半。时间复杂度O(NlgN)并非最优。

#include <vector>
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        sort(numbers.begin(),numbers.end());//先排序
        int num = numbers[numbers.size()/2];//得到中间数据
        int count = 0;
        for(int i = 0; i < numbers.size(); i++) //对数组进行遍历
        {
            if(numbers[i] == num)
            {
                count++;//统计num出现次数
            }
        }
        if(count > numbers.size()/2)//确认是否超过一半
            return num;
        return 0;
    }
};

答案解析:一种和上面一样,另一种就是这个。

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

class Solution {
    public:
    int MoreThanHalfNum_Solution(vector<int> numbers)
    {
        if(numbers.empty()) return 0;
        // 遍历每个元素,并记录次数;若与前一个元素相同,则次数加1,否则次数减1
        int 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;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/5495.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在VScode中配置Python开发环境----需要注意的一个点:settings.json

在VScode中配置Python开发环境&#xff08;可以参考这个博主的方法&#xff09;&#xff1a; http://t.csdn.cn/L1jux 1、安装python 官网下载地址&#xff1a;https://www.python.org/ftp/python/3.8.0/python-3.8.0-amd64.exe 双击打开.exe文件 勾选 Add Python 3.8 to Pat…

【计算机视觉 | 目标检测】DETR风格的目标检测框架解读

文章目录一、前言二、理解2.1 DETR的理解2.2 DETR的细致理解2.2.1 Backbone2.2.2 Transformer encoder2.2.3 Transformer decoder2.2.4 Prediction feed-forward networks (FFNs)2.2.5 Auxiliary decoding losses2.3 更具体的结构2.4 编码器的原理和作用2.5 解码器的原理和作用…

刚刚,Frontiers in Psychology 取消on hold状态,但这本期刊仍在评估中

3月28日时&#xff0c;Frontiers in Psychology仍处于on hold状态。 就在刚刚&#xff01;小编查询Frontiers in Psychology时&#xff0c;发现Master Journal List中&#xff0c;期刊Frontiers in Psychology的on hold标识没有了&#xff0c;这表示期刊目前正被SSCI数据库收录…

独立部署基于apiKey或accessToken的GPT聊天工具

最近chat-GPT的强大功能让人新潮澎湃,大家都在讨论,都想尝试一下。。。 奈何用不了!自己整整,内附具体步骤,如何用手机验证码注册,如何自己搭一个前端,nodejs后端,可以访问自己的GTP。 先上图: 自己搭的: 官网: 步骤一、用个代理 因为没这个无法访问GPT官网 忍…

类与对象,对象在内存的存在形式,java方法

类是抽象的&#xff0c;概念的&#xff0c;代表一类事物&#xff0c;比如人类&#xff0c;猫类..即它是数据类型对象是具体的实际的&#xff0c;代表一个具体事物&#xff0c;即实例。类是对象的模板&#xff0c;对象是类的一个个体&#xff0c;对应一个实例 public class Targ…

Jenkins入门

Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具 持续集成&#xff08;CI&#xff09;是在源代码变更后自动检测、拉取、构建和&#xff08;在大多数情况下&#xff09;进行单元测试的过程 可以简单将jenkins理解为一个代码部署工具。 在没有持续部署工具之前&#x…

【Redis进阶】Redis数据结构

文章目录1. 前言2. SDS2. 链表3. 压缩链表4. 哈希表5. 整数集合6. 跳表7. quicklist8. listpack1. 前言 Redis常用的数据结构为String&#xff0c;List&#xff0c;Hash&#xff0c;Set&#xff0c;Sorted Set。但这只是我们在用的时候键值对的表现形式&#xff0c;他们底层真…

《程序员面试金典(第6版)》面试题 08.05. 递归乘法

题目描述 递归乘法。 写一个递归函数&#xff0c;不使用 * 运算符&#xff0c; 实现两个正整数的相乘。可以使用加号、减号、位移&#xff0c;但要吝啬一些。 示例1: 输入&#xff1a;A 1, B 10 输出&#xff1a;10 示例2: 输入&#xff1a;A 3, B 4 输出&#xff1a;…

vue3使用useMouseInElement实现图片局部放大预览效果

1、首先要安装vueuse/core npm i vueuse/core2、实现过程如下&#xff1a; <template><div class"goods-image"><!-- 大图 --><div v-show"show" class"large" :style"[{backgroundImage:url(${images[currIndex]})…

Cursor,程序员的 AI 代码编辑助手

相信大家都或多或少地听说过、了解过 chatGPT &#xff0c;半个月前发布的 GPT-4 &#xff0c;可谓是 AI 赛道上的一个王炸 那么今天咸鱼给大家分享一个开源的 AI 代码编辑器——Cursor&#xff0c;让各位程序员在编程之路上一骑绝尘 &#x1f603; 介绍 Cursor 是一个人工智…

深度学习应用技巧4-模型融合:投票法、加权平均法、集成模型法

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下&#xff0c;深度学习中的模型融合。它是将多个深度学习模型或其预测结果结合起来&#xff0c;以提高模型整体性能的一种技术。 深度学习中的模型融合技术&#xff0c;也叫做集成学习&#xff0c;是指同时使用多个…

209. 长度最小的子数组

209. 长度最小的子数组 力扣题目链接(opens new window) 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入…

Java实现查找文件

1 问题 如何利用java来查找文件&#xff1f; 2 方法 2.1定义一个查找类&#xff0c;设置两个参数&#xff08;查找的目录和文件后缀名&#xff09;&#xff0c;然后判断文件夹是否为空 2.2 判断是否是文件夹&#xff0c;如果是文件夹则将里面的文件放入数组进行遍历&#xff08…

【Python零基础学习入门篇①】——基本语法与变量

⬇️⬇️⬇️⬇️⬇️⬇️ ⭐⭐⭐Hello&#xff0c;大家好呀我是陈童学&#xff0c;一个普通大一在校生&#xff0c;请大家多多关照呀嘿嘿&#x1f601;&#x1f60a;&#x1f618; &#x1f31f;&#x1f31f;&#x1f31f;技术这条路固然很艰辛&#xff0c;但既已选择&#x…

Redis 事务相关操作

Redis 作为一个非关系型内存数据库&#xff0c;也有事务定义 1. 事务的定义-ACID特性 A表示原子性&#xff1a;即事务是一个不可分割的实体&#xff0c;事务中的操作要么都完成&#xff0c;要么都不完成 C表示一致性&#xff1a;即事务前后数据完整性必须一致&#xff0c;假…

基于springboot实现数码论坛系统设计与实现演示【附项目源码+论文说明】

基于springboot实现数码论坛系统设计与实现演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

Jieba分词的准确率提升:使用paddle模式进行分词(使用百度飞桨深度学习模型进行分词)

1 Paddle模式简介 jieba中的paddle模式是指使用飞桨&#xff08;PaddlePaddle&#xff09;深度学习框架加速分词的一种模式。相对于传统的分词算法&#xff0c;paddle模式采用了深度学习模型&#xff0c;可以获得更高的分词准确度和更快的分词速度。 paddle模式是基于卷积神经…

数据分析之Pandas(2)

3.Pandas 文章目录3.Pandas3.3 Pandas进阶3.3.1 数据重塑和轴向旋转&#xff08;1&#xff09;层次化索引Series的层次化索引DataFrame的层次化索引层次化——电影数据示列&#xff08;2&#xff09;数据旋转3.3.2 数据分组、分组运算3.3.3 离散化处理3.3.4 合并数据集&#xf…

使用langchain打造自己的大型语言模型(LLMs)

我们知道Openai的聊天机器人可以回答用户提出的绝大多数问题,它几乎无所不知&#xff0c;无所不能&#xff0c;但是由于有机器人所学习到的是截止到2021年9月以前的知识&#xff0c;所以当用户询问机器人关于2021年9月以后发送的事情时&#xff0c;它无法给出正确的答案&#x…

【Java 21 新特性 】顺序集合(Sequenced Collections)

Java 21 中增加了一种新的集合类型&#xff1a;顺序集合&#xff08;Sequenced Collections&#xff09;。要介绍顺序集合&#xff0c;就首先要说明一下出现顺序&#xff08;encounter order&#xff09;。出现顺序指的是在遍历一个集合时&#xff0c;集合中元素的出现顺序。有…