Day3 字符串中找出连续最长的数字串、数组中出现次数超过一半的数字

news2024/11/25 4:29:00

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

成就一亿技术人


文章目录

  • 选择题
    • 1、进程管理
    • 2、计算机组成原理
  • 编程题
    • 1、字符串中找出连续最长的数字串
    • 2、数组中出现次数超过一半的数字


选择题

1、进程管理

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

选项:

  • A、4
  • B、48
  • C、192
  • D、12

分析:本题考的是 指针 大小及数组大小的计算,在 32 位平台下,指针大小为 4byte,而在 64 位平台下,指针大小为 8byte;在计算二维数组的大小时,需要通过 行 * 列 * 类型大小 的方式进行计算

在本题中,a 为一个 二维二级指针数组,无论是几级指针,在 32 位平台中都为 4byte,因此 a 的实际占用空间为 3 * 4 * 4 = 48

注意: 数组名表示数组中首元素的地址,但存在两种特殊情况:

  • sizeof(数组名) 计算的是整个数组的大小
  • &数组名 取出的是整个数组的地址

数组名

结果:B

图示

2、计算机组成原理

题目:假设在一个 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;
}

选项:

  • A、1,2,3
  • B、1、0、2
  • C、1、3、2
  • D、3、2、1

分析:小端序 机器中,低位存储数据的低地址,大端序 则相反;long long 占用 8byte 大小的空间,%d 匹配 int,占用 4byte 空间,当强行使用 %d 匹配 long long 输出数据时,会发生截断行为,导致数据读取时出现错位

关于 大小端序的相关问题可以查看这篇文章:《C语言进阶——数据在内存中的存储》

结合 printf 打印时的栈帧,可以得到下图中的分析

图解

注意: 在栈中,先入栈的最后出,因此是 c 先入栈、最后出栈;高精度数据向低精度数据进行转换时,会发生 截断 行为,导致数据丢失,因此要注意数据与格式匹配(long long 匹配格式为 lld

结果:B

图解


编程题

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

题目链接:OR59 字符串中找出连续最长的数字串

题目

题目分析:存在一个字符串 str,其中包含数字和其他字符,要求计算出 最长的数字子串;题目比较简单,直接 遍历+判断+统计,不断更新 最长数字子串的值,即可得到答案

图解

遇见数字时,记录当前位置 begin,不断向后走,直到遇见非数字或结尾,记录当前位置为 end,构造字符串并与历史记录的最长数字子串进行比较,如果比其长,则更新 numStr

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

int main()
{
    string str;
    while (getline(cin, str))
    {
        string numStr;  //最长数字子串

        auto it = str.begin();
        while (it < str.end())
        {
            if (isdigit(*it))
            {
                //通过区间构造数字子串
                auto begin = it;
                while (it != str.end() && isdigit(*it))
                    ++it;
                auto end = it;

                string tmp(begin, end);

                //更新最长的数字子串
                if (tmp.size() > numStr.size())
                    numStr = tmp;
            }
            else
                ++it;
        }

        cout << numStr << endl;
    }
}

注意: 在进行 while 循环时,需要特别注意边界问题,避免出现越界

图解

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

题目链接:JZ39 数组中出现次数超过一半的数

图解

题目分析:非常经典的题目,存在一个数组,其中某个数值超过了数组长度的一半,要求找出这个数,既然某个数超过了数组长度的一半,那么我们可以将其中的每个数出现次数统计起来,再次遍历即可确定这个数,当然这种解法比较废空间,除此之外,我们还可以将数组进行排序,中位数即出现次数超过一半的值

解法一:通过容器将其中的值与出现次数进行统计
这里使用 map 对数据进行存储,然后对 map 进行遍历确认数值即可
时间复杂度:N + logN + N / 2
空间复杂度:N / 2

#include <map>

class Solution 
{
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) 
    {
        map<int, int> table;    //建立 kv 表
        for(auto e : numbers)
            table[e]++;
        
        int n = numbers.size() / 2; //数组长度

        for(auto e : table)
        {
            //这个数值必然存在
            if(e.second > n)
                return e.first;
        }

        return 0;
    }
};

这种解法时间和空间效率都比较低,优点就是比较容易想到

结果

解法二:将数组进行排序,然后返回中位数
排序后,出现次数超过一半的值,必然位于中间
时间复杂度:N * logN
空间复杂度:logN

class Solution 
{
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) 
    {
        //先将数据进行排序
        sort(numbers.begin(), numbers.end());

        //直接返回中位数值
        return numbers[numbers.size() / 2];
    }
};

这个代码就更简单了,直接两行解决问题,不过还是不符合进阶要求

图解

解法三:将数组中,不相同的两个值置为 -1,最后再遍历数组,不为 -1 的值,就是目标
因为某个值出现次数超过一半,所以每 “去除” 两个不同的值,必然会将 某个值 以外的全部值去除,剩下的自然就是目标值了
时间复杂度:N + N —> N
空间复杂度:1

class Solution
{
public:
    int MoreThanHalfNum_Solution(vector<int> numbers)
    {
        size_t i = 0;
        size_t j = 0;
        while (i < numbers.size() && j < numbers.size())
        {
            // j 找到与 i 不同的值
            while (j < numbers.size() && numbers[i] == numbers[j])
                j++;

            //如果两个都没有越界,则置 -1
            if(i < numbers.size() && j < numbers.size())
                numbers[i] = numbers[j] = -1;

            //将 -1 跳过(-1 不参与比较)
            while (i + 1 < numbers.size() && numbers[i + 1] == -1)
                i++;

            while (j + 1 < numbers.size() && numbers[j + 1] == -1)
                j++;

            i++;
            j++;
        }

        //再次遍历,不为 -1 的值就是目标值
        for (auto e : numbers)
        {
            if (e != -1)
                return e;
        }

        return 0;
    }
};

这种解法是最优解,即减少了时间,也兼顾了空间

结果

注意: 在进行 while 循环时,需要特别注意越界问题,同时在涉及解引用时,也要注意越界问题

今天的选择题都和数据在内存中的存储有关;编程题则比较简单,无非就是进行遍历判断比较,编码时需要注意越界问题


星辰大海

相关文章推荐

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

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

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

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

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

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

相关文章

和数组处理有关的一些OJ题;ArrayList 实现简单的洗牌算法(JAVA)(ArrayList)

接上次博客&#xff1a;数据结构初阶&#xff08;2&#xff09;&#xff08;ArrayList简介、ArrayList()的构造方法、ArrayList的扩容、方法和三种遍历方法、ArrayList实现杨辉三角、ArrayList 的优缺点&#xff09;_di-Dora的博客-CSDN博客 1、给你一个数组 nums 和一个值 va…

FreeRTOS(6)----软件定时器

一&#xff0c;软件定时器概述 软件定时器允许设置一段时间&#xff0c;当设定的时间到达之后就会执行指定的功能函数&#xff0c;被定时器调用的这个函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期。 二&#xff0c;回调函数的注意事项 回调函数是…

Linux文件权限管理

1、Linux权限介绍 权限管理&#xff0c;其实就是指对不同的用户&#xff0c;设置不同的文件访问权限。 Linux 系统&#xff0c;最常见的文件权限有 3 种&#xff0c;即对文件的读&#xff08;用 r 表示&#xff09;、写&#xff08;用 w 表示&#xff09;和执行&#xff08;用…

github.io创建个人网站

文章目录 github.io介绍使用步骤新建仓库添加文件 github.io介绍 github.io是 GitHub 提供的免费 Pages服务&#xff0c;不需要购买云服务器和域名&#xff0c;就可以将自己的项目、博客在互联网上进行共享。 使用步骤 新建仓库 创建一个新的仓库&#xff0c;仓库名设置为如…

Nacos环境隔离

随着Nacos 0.8版本的release&#xff0c;Nacos离正式生产版本又近了一步&#xff08;其实已经有不少企业已经上了生产&#xff0c;如虎牙&#xff09;。一般而言&#xff0c;企业研发的流程一般是这样的&#xff1a;先在测试环境开发和测试功能&#xff0c;然后再灰度&#xff…

CANFDCAN协议对比 - 基础介绍_01

目录 一、为什么会出现CANFD&#xff1f; 1、信号数量大量增加 2、新要求&#xff0c;新总线系统 3、CAN性能限制 4、更短的位时间也能满足 &#xff1f;&#xff1f;&#xff1f;CAN是否会被取代&#xff1f; 二、CANFD优点 1、更多数据&#xff0c;更低总线负载率 2…

计算机网络 三(数据链路层)下

流量控制与可靠传输机制 流量控制手段&#xff1a;接收方收不下就不回复确认。 传输层流量控制手段&#xff1a;接收端给发送端一个窗口公告 #可用协议 可用协议 停止等待协议 概念、出现原因 停止等待协议是一种简单的数据传输协议&#xff0c;常用于数据传输的可靠性较低…

【Docker实战】使用Docker部署Tomcat

【Docker实战】使用Docker部署Tomcat 一、Tomcat介绍1. Tomcat简介2. Tomcat特点3. Tomcat容器部署的优点4. Tomcat的配置文件 二、检查本地环境三、检查本地Docker环境1. 检查本地Docker服务2. 检查Docker版本 四、搜索docker hub中的tomcat镜像五、下载tomcat镜像六、创建Tom…

chatgpt赋能Python-pythona的三次方

Python 的三次方&#xff1a;探索 Python 强大的数学计算能力 Python 是一种高级编程语言&#xff0c;被广泛应用于数据分析、机器学习、人工智能等领域。除此之外&#xff0c;Python 还拥有强大的数学计算能力&#xff0c;其中包括 Python 的三次方计算功能。在本文中&#x…

AI人工智能标记数据的技术:类型、方法、质量控制、应用

AI人工智能 标记数据 在人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;领域中&#xff0c;标记数据是非常重要的一环。它是指对原始数据进行标记和注释&#xff0c;以便机器学习算法可以理解和利用这些数据。标记数据可以提高机器学习模型的准确…

实战【云原生】--- Kubernetes集群

K8S集群负载均衡层防火墙 实例 一、kubeadm 部署 K8S 集群架构1、关闭所有节点的防火墙 核心防护 iptables swap交换2、修改主机名3、调整内核参数 二、安装Docker1、所有节点安装docker2、所有节点配置k8s源3、所有节点安装kubeadm&#xff0c;kubelet和kubectl 三、部署k8s集…

2023/5/21总结

因为之前高中学过一点点的html。虽然不是很多&#xff0c;但是有一点点基础&#xff0c;看了一些关于html的知识点&#xff0c;算是复习了&#xff0c;如果后面忘记打算再去查。 html是超文本标记语言&#xff0c;通常由<></>构成&#xff0c;当然也有单标记&…

chatgpt赋能Python-python5__2

Python中整除运算符 // 的用法和重要性 在Python中&#xff0c;整除运算符 // 有着广泛的应用&#xff0c;特别是在数据分析、科学计算、金融量化、游戏开发等领域中&#xff0c;它是很重要的基础运算符。 什么是整除运算符 //&#xff1f; 整除运算符 // 是Python中的一种二…

chatgpt赋能Python-pythonbmi

Python计算BMI - 计算和判断你的身体状况 BMI&#xff0c;即Body Mass Index&#xff0c;中文翻译为“身体质量指数”&#xff0c;是目前世界上公认的反映体重是否正常的最权威的指标之一。 计算BMI可以帮助我们判断自己的身体状况&#xff0c;是如今非常流行的健康指标之一。…

【iOS】SDWebImage源码学习--未完

SDWebImage的主要功能及相关知识点 SDWebImage是一个流行的第三方库&#xff0c;用于在iOS和macOS应用程序中异步下载和缓存图像。它提供了一种简单而强大的方式来处理网络图像加载和缓存&#xff0c;具有以下主要功能&#xff1a; 异步下载&#xff1a;SDWebImage使用多线程…

MyBatis中动态SQL的使用和注意事项说明

文章目录 0、前言1、if2、where3、trim4、choose-when-otherwise5、foreach应用场景1&#xff1a; 通过数组实现批量删除应用场景2&#xff1a; 通过list集合实现批量添加 6、include抽取公共SQL片段 0、前言 MyBatis框架动态SQL技术是根据特定的条件拼接SQL语句的功能&#x…

【计算机图形学】曲线和曲面

模块5 曲线和曲面 一 实验目的 编写曲线和曲面的算法 二 实验内容 1&#xff1a;绘制Bezier曲线&#xff0c;并采用自行设计输入和交互修改数据点的方式。 实验结果如下图所示&#xff1a; 第一步&#xff1a;输入特征多边形的顶点个数&#xff0c;并按照顺序输入顶点的坐…

《心静的力量》读书笔记

让心静下来&#xff0c;战胜一切忧虑 于我们每个人而言&#xff0c;最重要的就是不要去看远方模糊不清的事&#xff0c;而要做手边真实清楚的事。 明天的重担&#xff0c;加上昨天的重担&#xff0c;会成为今天的最大障碍&#xff0c;要把未来同过去一样紧紧地关在门外……未…

将MetaHuman的身体替换为虚幻商城模型的身体

一、准备好MetaHuman模型和虚幻商城模型 1.准备好MetaHuman模型,参考这篇文章 虚幻商城模型转MetaHuman制作MetaHuman并导入UE,同时复制一个MetaHuman模型 2.下载虚幻商城的原始模型,并导入UE 二、将虚幻商城模型的头去掉 1.打开虚幻商城的模型,找到分段 2.在右边点击…

chatgpt赋能Python-pythonapp开发

PythonApp开发&#xff1a;为什么选择Python实现&#xff1f; Python是当今最流行的编程语言之一&#xff0c;尤其在Web应用开发和数据分析领域更是大有作为。本文将探讨Python在App开发领域中的表现&#xff0c;为什么Python可以成为您理想的选择&#xff1f; 1. 简单易学 …