【C++】vector OJ练习

news2024/11/17 23:31:32

文章目录

    • 1. 只出现一次的数字
      • 思路讲解
      • AC代码
    • 2. 杨辉三角
      • 思路讲解
      • AC代码
    • 3. 只出现一次的数字 III
      • 思路讲解
      • AC代码
    • 4. 只出现一次的数字 II
      • 思路讲解
      • AC代码
    • 5. 删除有序数组中的重复项
      • 思路讲解
      • AC代码
    • 6. 数组中出现次数超过一半的数字
      • 思路讲解
      • AC代码

这篇文章我们来做几道vector相关的OJ练习,练习一下vector的使用。。

1. 只出现一次的数字

题目链接: link
在这里插入图片描述

思路讲解

那这道题我们用^来搞是不是就非常简单啊。
两个相同的整数异或结果为0;0和任何整数异或结果还是这个数本身。
所以可以怎么搞,定义一个变量初始值为0,遍历数组,让它和每一个元素进行异或,最终的结果就是数组中只出现一次的那个数字。

AC代码

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret=0;
        for(auto e:nums)
            ret^=e;
        return ret;
    }
};

在这里插入图片描述

2. 杨辉三角

题目链接: link
在这里插入图片描述

思路讲解

这道题呢是给我们一个行数 numRows,生成「杨辉三角」的前 numRows 行。
那这道题的思路是很简单的,没什么难度:
核心思想:找出杨辉三角的规律,发现每一行头尾都是1,中间第[j]个数等于上一行[j-1]+[j]。
但是,如果我们用C语言去写这道题:
在这里插入图片描述
大家看,其实是有点麻烦的,一级指针、二级指针,最终返回的数组还得是malloc的。首先这个参数可能就给我们看懵逼了。
而C++呢?
在这里插入图片描述
C++有了vector,就爽很多了。
不过这里需要用到vector<vector>,这是什么东西,🆗,就是一个二维的vector嘛,类似于二维数组,但是如果是二维数组,我们开一个m x n的,它的每行元素是不是相等的啊,而这里杨辉三角是不是每行元素个数不一样啊。
但是用vector,我们是不是就可以很方便的控制每行的size啊。
在这里插入图片描述
我们只需要定义一个numRows行的vector<vector>,每行的元素个数是多少?
是不是i+1啊,i等于0(第0行),就是一个元素;i等于1,两个元素;以此类推。
然后只需把每行第一个和最后一个元素初始化为1 ,中间剩余的元素是不是就是它上一行的元素和上一行的前一个元素相加的和啊。

AC代码

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> ret(numRows);
        for(int i=0;i<numRows;i++)
        {
            ret[i].resize(i+1,0);
            ret[i][0]=ret[i][ret[i].size()-1]=1;
        }
        for(size_t i=0;i<ret.size();++i)
        {
            for(size_t j=0;j<ret[i].size();++j)
            {
                if(ret[i][j]==0)
                    ret[i][j]=ret[i-1][j]+ret[i-1][j-1];
            }
        }
        return ret;
    }
};

在这里插入图片描述

3. 只出现一次的数字 III

题目链接: link
在这里插入图片描述

思路讲解

大家看这道题是不是第一题的一个升级版啊,第一道题是让我们找出数组中那个只出现一次的数字,而这道题与第一题的区别是里面多了一只“单身狗”,有两个只出现一次的数字,其余数字都是出现两次,我们要找出这两只单身狗。

那我们可以怎么做呢?

第一道的方法在这种情况下是不是就不适用了啊,那我们能不能把第二道题转换为第一道题的那种情况,然后再用同样的方法求解。
怎么转换呢?
🆗,我们可以考虑去做一个分组:
比如,那这样一组数据:1 2 3 4 5 1 2 3 4 6,那这里5跟6是不是就是我们要找的两个数字啊。
那我们就可以把所有的数据分为两组,但是要保证5跟6在不同的组里,并且每组除了5跟6剩余的数字都是成对出现的:
比如,这样:
在这里插入图片描述
或者这样:
在这里插入图片描述

那现在问题来了,怎么做可以把5跟6分开到不同的组里呢?

🆗,我们可以这样做,大家想,我们要找的这两个数字肯定是不相等的,那它们异或的结果里面肯定有1:
比如,5的二进制序列是101,6是110,它们异或的结果是011
那这个结果说明了什么?
是不是说明5的二进制序列的第一位和6的二进制序列的第一位是不相等的啊,那肯定一个是1 ,一个是0 ,那我们就可以把数组里所有数字中第一位是0的分到一组,第一位是1 的分到一组,那这样5和6肯定不在同一组,因为我们特意选了它们二进制序列不同的那一位进行的分组,另外这样做的话,除了5跟6之外的其它元素肯定是成对出现在其中一组的
当然,这里不止可以选择用第一位去分组,这里5跟6 二进制序列的第二位是不是也不同啊,你也可以根据第二位是0还是1去分组。
那分完组的话,是不是就是第一题的情况了,每组只有一个单身狗,剩余数字均成对出现,那两组数字与0异或的两个结果就是两个单身狗了。

AC代码

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        //0和所有数字异或,最终结果ret就是两个单身狗异或的结果
        int ret=0;
        for(auto e:nums)
            ret^=e;
        //判断两个单身狗的二进制位中第几位不同(即ret哪一位是1),我们选第一个不同的位置就行了
        int pos=0;//pos记录不同的位置
        for(int i=0;i<31;i++)
        {
            if((ret>>i)&1==1)
            {
                pos=i;
                break;
            }
        }
        int num1=0;
        int num2=0;
        //将数组中所有元素中的二进制位中第pos位为1的分一组,为0的分一组,两组数字与0异或的两个结果就是两个单身狗
        for(auto e:nums)
        {
            if((e>>pos)&1==1)
                num1^=e;
            else
                num2^=e;
        }
        vector<int> fin;
        fin.push_back(num1);
        fin.push_back(num2);
        return fin; 
    }
};

在这里插入图片描述

4. 只出现一次的数字 II

题目链接: link
在这里插入图片描述

思路讲解

这道题还是让我们找出数组中只出现一次的那个数字,但是与第一题不同的是,其余数字均出现三次。
那我们用第一题的方法肯定是不行了,那我们可以怎么做呢?
我们后面学了unordered_map的话用unordered_map其实可以很容易解这道题,不过我们现在还没学。

那这里我就用了一种比较暴力的方法,也很好理解:

怎么做呢?
遍历数组,一次取每个元素与其余元素进行比较,如果出现相等的情况,那就说明当前元素不是我们要找的数字,那就看下一个,如果某个元素与其余数字都不想等,就是要找的目标数字。
当然效率可能没有那么高。

AC代码

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret=0;
        for(int i=0;i<nums.size();++i)
        {
            int flag=1;
            for(int j=0;j<nums.size();++j)
            {
                if(i==j)
                    continue;
                if(nums[i]==nums[j])
                {
                    flag=0;
                    break;
                }
            }
            if(flag)
            {
                ret=nums[i];
                break;
            }
        }
        return ret;
    }
};

在这里插入图片描述

5. 删除有序数组中的重复项

题目链接: link
在这里插入图片描述

思路讲解

这道题我们可以考虑使用“双指针”来求解:
首先,定义两个变量作为指针,初始都指向下标为0位置。
在这里插入图片描述
如果两指针指向的元素相等,我们只让 src++往后走,过滤掉重复值。
在这里插入图片描述
如果不再相等,先让dest++,让后把src指向的元素赋值给dest指向的元素,然后再让src++。
在这里插入图片描述
然后再判断两指针指向的元素是否相等,重复上述操作,直至src遍历完数组。
在这里插入图片描述
最终dest+1就是去重后的数组长度。

AC代码

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int dest=0;
        int src=0;
        while(src<nums.size())
        {
            if(nums[src]==nums[dest])
                ++src;
            else
            {
                // ++dest;
                // nums[dest]=nums[src];
                // ++src;
                nums[++dest]=nums[src++];
            }
        }
        return dest+1;
    }
};

在这里插入图片描述

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

题目链接: link
在这里插入图片描述

思路讲解

这道题其实有一个很简单的解法:
怎么做呢?
只要给这个数组排下序就行了,然后直接返回排好序之后数组中间的那个元素即可。
因为我们要找的数字在数组中出现的次数超过数组长度的一半,所以排好序之后中间位置的元素肯定是这个出现的次数超过数组长度的一半的元素。

AC代码

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        sort(numbers.begin(),numbers.end());
        return  numbers[numbers.size()/2];
    }
};

在这里插入图片描述

这篇文章的内容就到这里,欢迎大家指正!!!
在这里插入图片描述

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

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

相关文章

Jenkins学习笔记

Jenkins学习笔记 1、基本概念 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 2、安装 文件包&#xff1a;https://pan.…

半监督目标检测

有监督目标检测&#xff1a; 拥有大规模带标签的数据&#xff0c;包括完整的实例级别的标注&#xff0c;即包含坐标和类别信息&#xff1b;弱监督目标检测&#xff1a; 数据集中的标注仅包含类别信息&#xff0c;不包含坐标信息&#xff0c;如图一 b 所示&#xff1b;弱半监督目…

RHCE-防火墙

目录 一、防火墙介绍 1.1、什么是防火墙 1.2、防火墙的功能&#xff1a; 1.3、linux防火墙的架构 二、iptables 2.1iptables介绍 2.2名词术语&#xff1a; 什么是容器&#xff1f; 什么是Netfilter/Iptables&#xff1f; 什么是表&#xff08;tables&#xff09;&#x…

学历到底是敲门砖还是枷锁?—探讨“孔乙己文学”热搜背后的教育话题

序言 最近&#xff0c;“孔乙己文学”一度成为网络热门话题&#xff0c;引起了不少人的讨论。其中&#xff0c;一句“学历不仅是敲门砖&#xff0c;也是我下不来的高台&#xff0c;更是孔乙己脱不下的长衫”引发了广泛共鸣&#xff0c;让人深思。 敲门砖 or 枷锁&#xff1f; 对…

黑盒测试过程中【测试方法】详解4-因果图

在黑盒测试过程中&#xff0c;有9种常用的方法&#xff1a;1.等价类划分 2.边界值分析 3.判定表法 4.正交实验法 5.流程图分析 6.因果图法 7.输入域覆盖法 8.输出域覆盖法 9.猜错法 黑盒测试过程中【测试方法】讲解1-等价类&#xff0c;边界值&#xff0c;判定表_朝一…

大模型竞争加剧,国内外 AI 监管进一步升级

随着人工智能技术的不断发展&#xff0c;大模型已成为当下最热门的话题之一。不仅国内外的科技公司都在积极投入研发&#xff0c;各国政府也在加大监管力度&#xff0c;以确保人工智能技术的安全和可持续发展。本文将从三个层次分别探讨大模型的定义和热度、国内外AI监管的现状…

【STM32】基础知识 第八课 MDK 工程

【STM32】基础知识 第八课 MDK 工程 准备工作新建寄存器版本 MDK 工程步骤新建工程文件夹添加文件魔术棒设置绝对路径和相对路径对比测试程序 新建 HAL 库版本 MDK 工程CMSISHAL 库简介DriversMiddlewaresDevice 和 Include HAL 库文件介绍HAL 库 API 函数和比那辆命名规则HAL …

Fedora 38 正式发布

Fedora Linux 38 正式发布&#xff0c;用户可以访问官网下载安装最新版本。 新网站 如果你点击了上面的官网链接&#xff0c;你应该会注意到 Fedora 的官网看起来与之前有了很大不同。这是 Fedora Websites & Apps 团队与 Design & Infrastructure 团队以及广大社区合作…

HCIA-RS实验-ENSP搭建一个基础的IP网络

HCIA-RS是华为认证网络工程师&#xff08;Routing & Switching&#xff09;的缩写。通过考取HCIA-RS证书&#xff0c;可以证明自己有能力设计、实现和维护小型网络。而HCIA-RS实验则是考试的一部分&#xff0c;是考生必须要完成的实践环节。这将是第一篇文章&#xff0c;后…

Qt连接MySQL数据库最详细的教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.直接通过MySQL的驱动加载数据库1&#xff09;所需代码2&#xff09;解决QMYSQL driver not loaded 2.通过ODBC连接MySQL数据库&#xff11;&#xff09;官方解释2…

如何react中使用redux和react-redux

Redux Redux 是 JavaScript 状态容器&#xff0c;提供可预测化的状态管理。 可以让你构建一致化的应用&#xff0c;运行于不同的环境&#xff08;客户端、服务器、原生应用&#xff09;&#xff0c;并且易于测试。 不仅于此&#xff0c;它还提供 超爽的开发体验&#xff0c;比…

指针可以这样认知

注&#xff1a;此篇文章仅限初步了解&#xff0c;本小白后续会持续进行详解指针的相关操作。 目录&#xff1a; 认知内存一个内存单元的大小地址的产生 理解指针用途 指针变量的大小&#x1f49e;结尾 了解指针为什么需要了解内存呢&#xff1f; 因为指针是用来管理内存&#x…

【k8s】ruoyi微服务迁移到k8s

书接上回【传统方式部署Ruoyi微服务】&#xff0c;此刻要迁移至k8s。 环境说明 31 master &#xff0c; 32 node1 &#xff0c; 33 node2迁移思路 交付思路: 其实和交付到Linux主机上是一样的&#xff0c;无外乎将这些微服务都做成了Docker镜像; 1、微服务数据层: MySQL、 R…

聊聊 IP packet 的 TTL 与 tcp segment 的 MSL

聊聊 IP packet 的 TTL 与 tcp segment 的 MSL 1 前言 - 网络知识的重要性 近几年在排查解决应用系统在客户现场遇到的复杂问题时&#xff0c;越来越觉得除了扎实的LINUX操作系统知识&#xff0c;对TCP/IP网络知识的深入理解也是至关重要的。 有鉴于此&#xff0c;后续笔者会…

排序算法---插入排序

插入排序是一种简单的排序算法&#xff0c;一般又称为直接插入排序。插入排序的思想与选择排序有些相似&#xff0c;即在原数组上将数组分为两个部分&#xff1a;已排列好的有序数组和待排列数组&#xff0c;选择排序强调的是“选择”&#xff0c;而插入排序强调的是”插入“&a…

【Excel统计分析插件】上海道宁为您提供统计分析、数据可视化和建模软件——Analyse-it

Analyse-it是Microsoft Excel中的 统计分析插件 它为Microsoft Excel带来了 易于使用的统计软件 Analyse-it在软件中 引入了一些新的创新统计分析 Analyse-it与 许多Excel加载项开发人员不同 使用完善的软件开发和QA实践 包括单元/集成/系统测试 敏捷开发、代码审查 …

【JavaScript面向对象】

JavaScript面向对象 1 本节目标2 面向对象编程介绍2.1 两大编程思想2.2 面向过程编程POP2.3 面向对象编程OOP2.4 面向过程和面向对象的对比 3 ES6中的类和对象3.1 对象3.2 类class3.3 创建类3.4 类constructor构造函数3.5 类添加方法3.6 三个注意点 4 类的继承4.1 继承4.2 supe…

matlab 点云采样相关操作-源码复制粘贴即可

1.随机采样一个百分点的随机抽样 clc; clear; close all; % clear everything% Import point cloud pc pointCloud(Lion.xyz);% Plot all points pc.plot; % points are colored by z coordinate title(All Points, Color, w); view(0,0); snapnow;% Select randomly 5 perce…

FL Studio21免费吗?怎么下载最新中文版本?

FL Studio中文版已上线&#xff0c;自20.8版起已支持简体中文。推荐使用Windows 10系统安装&#xff0c; Windows 7系统设置FL Studio语言为中文时若出现乱码&#xff0c;可以将Win10系统中的“微软雅黑”字体复制并安装进Win7系统电脑中&#xff01;FL Studio支持什么格式的插…

【软考数据库】第四章 操作系统知识

目录 4.1 进程管理 4.1.1 操作系统概述 4.1.2 进程组成和状态 4.1.3 前趋图 4.1.4 进程同步与互斥 4.1.5 进程调度 4.1.6 死锁 4.1.7 线程 4.2 存储管理 4.2.1 分区存储管理 4.2.3 分页存储管理 4.2.…