Day2 排序子序列、倒置字符串

news2024/11/28 10:42:33

✨个人主页: 北 海
🎉所属专栏: C/C++相关题解
🎃操作环境: Visual Studio 2019 版本 16.11.17

成就一亿技术人


文章目录

  • 选择题
    • 1.字符串/C指针
    • 2.计算机组成原理
  • 编程题
    • 1.排序子序列
    • 2.倒置字符串


选择题

1.字符串/C指针

题目:下列叙述错误的是()

char acX[]="abc";
char acY[]={'a','b','c'};
const char *szX="abc";
const char *szY="abc";

选项:

  • A. acXacY 的内容可以修改
  • B. szXszY 指向同一个地址
  • C. acX 占用的内存空间比 acY 占用的大
  • D. szX 的内容修改后,szY 的内容也会被更改

分析:本题知识点为 字符与字符串+数组名与指针的区别+常量指针的特点,字符串由字符构成,并且会多出一个结束字符 '\0';数组中存储的数据位于 区,是可读可写的,而常量指针所指向的数据位于 常量区,只可被读取;同时因为 常量区 中相同的数据只会存在一份,因此不同的常量指针指向的对象为同一个

因为 数组中存储的数据位于 栈区,可读可写,所以 A 正确

常量区中的同一个数据只会存在一份,因此两个不同的常量指针指向同一个对象,地址自然相同,B 正确

在字符数相同的情况下,存储字符串所占空间比单纯存储字符大 1 字节,因此 C 正确

常量区中的数据不可被修改D 错误;假若通过某种特殊手段对其读写权限进行更改后,szX 的内容修改确实会影响 szY 内容,但这里只是普通场景,因此错误

注意: 直接打印常量指针 szXszY 时,会打印其所指向的内容,如果想查看指针值(地址)需要指定输出格式或进行转换

结果:D

图解

2.计算机组成原理

题目:在32位cpu上选择缺省对齐的情况下,有如下结构体定义:

struct A 
{
	unsigned a : 19;
	unsigned b : 11;
	unsigned c : 4;
	unsigned d : 29;
	char index;
};

sizeof(struct A) 的值为()

选项:

  • A. 9
  • B. 12
  • C. 16
  • D. 20

分析:本题知识点为 位段,相关知识可以查看这篇文章 《C语言进阶——自定义类型》位段 结构在存储数据时,会根据后面的大小(表示所需要的比特位)填入待开辟的空间中,假设当前空间无法容纳下一个成员,则会重新开辟空间进行存储,所有数据存储后,会进行 内存对齐

注:unsignedunsigned int 等价,都表示无符号整型

首先开辟 4 字节大小的空间(32 比特位),当成员 a 占用 19 比特位空间后,剩余 13 比特位

然后成员 b 紧接着 a 继续占用 11 比特位,此时 剩余 2 比特位

当成员 c 想占用 4 比特位时,发现 剩余的比特位(2 比特位)已经无法满足其需求了,于是编译器会重新开辟一块 4 字节大小的空间,将 c 存进去,此时新空间剩余 28 比特位,累计开辟了 8 字节空间

同理,当 d 想存储时,发现 剩余的比特位(28 比特位)也无法将自己完整的存储进去,于是编译器会再开辟 4 字节空间,将 d 进行存储,此时新空间剩余 3 比特位,累计开辟了 12 字节空间

最后虽然 index 只需 8 比特位(一个 char1 字节),但因 剩余比特位(3 比特位)无法存下,于是会新开辟 1 字节大小的空间,将 index 进行存储,现在已经共计开辟了 13 字节的空间

为了方便后续数据的读取,编译器会进行 内存对齐,将所占用的空间对齐至最大已开辟新空间(int)的整数倍,现在是占用了 13 字节,不是 int 的整数倍,因此会多开辟至 16 字节,确保 内存对齐

总的来说,struct A 中各成员的内存占用情况如下图所示:

图解

注意: 位段 在存储时本着 共用空间 的原则,将不同需求的成员放在同一块空间中,假若放不下,则会重新开辟新空间进行存储,位段 只有在所有成员都存储后,才会进行内存对齐

结果:C

结果


编程题

1.排序子序列

题目链接:排序子序列

题目

题目分析:现在有一个正整数数组 A,牛牛想要将其分割为 非递增非递减 子序列,最少可以分为几个序列;非递增 表示 递减中包含相等的情况非递减 则是 递增中包含相等的情况,题目给出的数组 A 有可能是 非有序 的,因此需要将其进行划分为子序列,本题的解题关键在于 对 非递增非递减 之间的切换的把握

  • 首先对整个数组 A 进行遍历
  • 假设 A[pos] < A[pos + 1] 说明此时即将进入 非递增 区间,可以将其走完(或者走到变成 非递减),此时获得一个 非递增 的子序列
  • 同理如果 A[pos] > A[pos + 1],则一样需要往后走,直到不符合规则,获得一个 非递减 的子序列
  • 假设是相等的情况,可以不用管,直接正常向后走一步即可

注意: 在向后走的过程中,可能出现越界问题,可以将数组 A 的空间多开辟一块空间,确保不会越界(因为题目明确其中的值为正整数,所以最后一块空间中的 0 值不会影响子序列)

结果

#include <iostream>
#include <vector>
using namespace std;

size_t getSubStrNum(const vector<int>& v, size_t n)
{
    int strNum = 0; //子序列数

    //遍历 v
    size_t pos = 0;
    while (pos < n)
    {
        if (v[pos] < v[pos + 1])
        {
            //进入非递减区域,开始向后走,直到不符合规则
            while (pos < n && v[pos] <= v[pos + 1])
                pos++;
            strNum++;
            pos++;
        }
        else if (v[pos] == v[pos + 1])
        {
            //相等时,可以忽略,直接向后走
            pos++;
        }
        else
        {
            //进入非递增区域,开始向后走,直到不符合规则
            while (pos < n && v[pos] >= v[pos + 1])
                pos++;
            strNum++;
            pos++;
        }
    }

    return strNum;
}

int main()
{
    int n = 0;  //输入的数据数
    while (cin >> n)
    {
        vector<int> A(n + 1);
        for (int i = 0; i < n; i++)
            cin >> A[i];    //将数据存入 vector 中
        size_t subStrNum = getSubStrNum(A, n); //获取可分割的子序列数
        cout << subStrNum << endl;
    }

    return 0;
}

注意:

  • 每次在成功获取(走完)一个子序列后,pos 需要向后移动一位,进入新的子序列判断
  • 在进行子序列获取(移动)时,需要注意越界问题,可以在开辟数组时,多开辟一块空间

结果

2.倒置字符串

题目链接:倒置字符串

题目

题目分析:将字符串倒置后,要确保每个单词的及标点符号的合理性,因此需要先将其整体倒置,然后再分别对每一个单词(含标点)进行倒置,这样就能达到题目要求

题目比较简单,先来看看 C++ 版本(可以用库函数和容器)

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    string str;
    while (getline(cin, str))
    {
        //先将 str 整体倒置
        reverse(str.begin(), str.end());

        //再将每次单词及标点进行倒置
        auto begin = str.begin();
        auto end = str.begin();

        while (end != str.end())
        {
            while (end != str.end() && *end != ' ')
                end++;

            reverse(begin, end);
            
            if (end != str.end())
                ++end;

            begin = end;
        }

        cout << str << endl;
    }
    return 0;
}

再来看看 C语言 版本(需要自己写函数)

#include <stdio.h>
#include <string.h>
#include <assert.h>

void myReverse(char* str, int begin, int end)
{
    assert(str);

    //双指针交换
    while(begin < end)
    {
        char ch = str[begin];
        str[begin] = str[end - 1];
        str[end - 1] = ch;
        begin++;
        end--;
    }
}

int main() 
{
    char str[100] = { 0 };  //str 不超过 100
    while(gets(str))
    {
        int len = strlen(str);

        //先整体倒置
        myReverse(str, 0, len);

        //再逐个单词及标点进行倒置
        int begin = 0;
        int end = 0;
        while(end < len)
        {
            while(end < len && str[end] != ' ')
                end++;
            
            myReverse(str, begin, end);

            if(end < len)
                end++;
            
            begin = end;
        }

        printf("%s\n", str);
    }

    return 0;
}

可以看出 C 还是要高效一些

结果

注意: 在进行倒置时,需要注意边界问题,一般范围为 左闭右开

今天的选择题2中,需要重点回顾 位段 相关知识,如内存对齐;关于编程题1,需要想清楚子序列的获取判断逻辑,重点注意边界问题,编程题2也是如此


星辰大海

相关文章推荐

Day1 组队竞赛、删除公共字符

C++题解 | 逆波兰表达式相关

C语言题解 | 去重数组&&合并数组

C语言题解 | 消失的数字&轮转数组

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络协议详解】——数据链路层协议(学习笔记)

&#x1f4d6; 前言&#xff1a;数据链路层是 OSI 模型中的第二层&#xff0c;位于物理层之上&#xff0c;是通信网络中的重要组成部分之一。数据链路层协议负责将网络层传输的数据分组封装成帧&#xff0c;传输到物理层&#xff0c;并通过物理介质进行传输。同时&#xff0c;数…

为什么有些同事昨天还干的好好地,今天就离职了老板都留不住?

HR时常会遭遇员工突发申请离职&#xff0c;对于一些核心岗位员工的离职&#xff0c;甚至没有时间去挽留。 但从心理学的角度来说&#xff0c;人的行为与意识是相互反应、互加映衬的。 也就是说&#xff0c;员工离职意识的产生与发展&#xff0c; 与他近期的行为息息相关。 与…

零基础学软件测试怎么样? 完好就业吗

在当今数字化快速发展的社会中&#xff0c;软件行业已经成为了一个具有巨大潜力和广阔前景的行业。而软件测试作为软件开发过程中不可或缺的一部分&#xff0c;也因此成为了备受瞩目的职业之一。 对于零基础的人来说&#xff0c;学习软件测试是一项非常实用的技能&#xff0c;…

PyQt5开发入门到IP查询工具实现

1 基本介绍 1.1 简介 ,QT 是最强大的 GUI 库之一&#xff0c;PyQt 是 Python 绑定 QT 应用的框架,是最强大和流行的跨平台 GUI 库之一。 PyQt 兼容所有流行的操作系统&#xff0c;包括 Windows、Linux 和 Mac OS。 它是双重许可的&#xff0c;可在 GPL 和商业许可下使用。新…

stm32f407单片机上通过HAL库实现can总线数据的收发

最近在使用can总线&#xff0c;由于这个以前接触的比较少&#xff0c;所以调试代码的时候直接是下载的正点原子的例程&#xff0c;在这个基础上修改调试的。现在将调试中遇到的问题&#xff0c;总结一下&#xff0c;避免以后踩坑。目前写了一个查询方式的&#xff0c;一个中断方…

Kubernetes第4天

第六章 Pod控制器详解 本章节主要介绍各种Pod控制器的详细使用。 Pod控制器介绍 Pod是kubernetes的最小管理单元&#xff0c;在kubernetes中&#xff0c;按照pod的创建方式可以将其分为两类&#xff1a; 自主式pod&#xff1a;kubernetes直接创建出来的Pod&#xff0c;这种p…

Nginx的原理

Nginx的原理 1、mater 和 worker2、worker 如何进行工作的3、一个 master 和多个 woker 有好处4、设置多少个 woker 合适5、连接数 worker_connection 1、mater 和 worker 2、worker 如何进行工作的 3、一个 master 和多个 woker 有好处 &#xff08;1&#xff09;可以使用 ng…

Kubernetes第5天

第七章 Service详解 本章节主要介绍kubernetes的流量负载组件&#xff1a;Service和Ingress。 Service介绍 ​ 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也就意味着…

【计算机网络详解】——数据链路层(学习笔记)

&#x1f4d6; 前言&#xff1a;数据链路层提供了一种在不可靠的物理介质上传输数据的方式&#xff0c;并负责在网络层和物理层之间提供一个可靠的通信连接。本文将对数据链路层进行详细的介绍&#xff0c;包括数据链路层的定义、协议、功能和应用等方面。 目录 &#x1f552; …

Jenkins持续集成之jenkins安装入门教学

Jenkins安装 1、下载jenkins&#xff1b;官方地址&#xff1a;https://www.jenkins.io/ 2、点击Download 3、下载windows版本的安装包后缀为msi&#xff1b; 4、双击安装&#xff1b;如下图 5、安装到指定的盘&#xff1b;再点击next 6、勾选第一个框&#xff1b;再点击next 7…

《Netty》从零开始学netty源码(五十八)之NioEventLoop.execute()

目录 NioEventLoop.execute()addTask()startThread()NioEventLoop.run()select()处理keys与执行任务processSelectedKeys()处理AbstractNioChannelselectAgain() runAllTasks()fetchFromScheduledTaskQueue()runAllTasksFrom()afterRunningAllTasks() 带截止时间的runAllTasks(…

国考省考行测:图形推理题1,2平移,旋转,翻转

国考省考行测&#xff1a;图形推理题1,2平移&#xff0c;旋转&#xff0c;翻转 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xff…

[数据结构 -- C语言] 栈(Stack)

目录 1、栈 1.1 栈的概念及结构 2、栈的实现 2.1 接口 3、接口的实现 3.1 初始化 3.2 入栈/压栈 3.3 出栈 3.4 获取栈顶元素 3.5 获取栈中有效元素个数 3.6.1 bool 类型接口 3.6.2 int 类型接口 3.7 销毁栈 4、完整代码 5、功能测试 1、栈 1.1 栈的概念及结构 …

软件测试工程师简历要怎么写,才能让HR看到

作为软件测试的从业者&#xff0c;面试或者被面试都是常有的事。 可是不管怎样&#xff0c;和简历有着理不清的关系&#xff0c;面试官要通过简历了解面试者的基本信息、过往经历等。】、 如果你不知道软件测试简历怎么写&#xff0c;可以看看这个视频是怎么写的&#xff0c;…

ARM-底层/Day2

.text .global _start _start:mov r0,#9mov r1,#15bl cmp_funccmp_func:cmp r0,r1beq stop 相等则跳转结束 subhi r0,r0,r1subcc r1,r1,r0mov pc,lr 不相等则返回执行 stop: b stop .end 循环实现1~100之间的和 .text .global _start _start:mov r0,#0mov r1,#1bl sum_fun…

CCF-CSP 202104-1 灰度直方图

简单的一题&#xff0c;理解题意&#xff0c;使用哈希数组即可 #include<iostream>using namespace std;int L,n,m; int mapp[505][505]; int arr[300];int main(){cin>>n>>m>>L;for(int i0;i<n;i){for(int j0;j<m;j){cin>>mapp[i][j];arr…

C++之STL

一、六大组件&#xff1a; 容器&#xff1a; 各种数据结构&#xff0c;如vector、list、deque、set、map等,用来存放数据&#xff0c;从实现角度来看&#xff0c;STL容器是一种class template。 算法&#xff1a; 各种常用的算法&#xff0c;如sort、find、copy、for_each。…

你也可以成为营销策划大咖,只需掌握这些技巧

本人是从业营销策划行业近10年的老广告人&#xff0c;我说的话你可以选择相信。 千万不要看轻了广告策划这个职业的技术含量&#xff0c;不是说你语言文字能力比较好就一定能够适合这个行业。 想要进入这个行业的大公司&#xff0c;你如果是刚毕业的新人的话&#xff0c;首先…

Linux的使用

强制停止 ctrlc 停止程序的运行退出当前命令的输入 退出或登出 ctrld 退出账户的登录退出某些特定程序的专属页面不能用于退出vi/vim 历史命令搜索 查看历史输入过的命令 history可通过! 命令前缀&#xff0c;自动执行上一次匹配前缀的命令&#xff08;用于最近的2~3/4~5个…

SpringBoot中如何处理MySQL中存储的JSON数据?

目录 一、MySQL中如何保存JSON类型的数据 1.1 建表 1.2 保存一条带json的记录 1.3 查询 二、Springboot操作当前数据库表 2.1 方式一&#xff08;推荐&#xff09; 2.2 方式二 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式 。简洁…