探索C嘎嘎的奇妙世界:第十六关---STL(vector的练习)

1.只出现一次的数字

        我们可以使用异或运算来解决这个问题:
 
        异或运算有一个重要的性质:两个相同的数进行异或运算结果为 0,任何数与 0 异或结果为其本身。对于数组中的元素,依次进行异或运算,出现两次的元素异或后会变成 0,最后剩下的就是只出现一次的那个元素。
        以下是具体步骤:
        数组 [2,2,1],2^2=0,0^1=1,所以输出 1。

那么请看正确代码:

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

这是一种方法,然而还有一种传统的方法:

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

        上述代码首先创建一个变量flag并将其初始化为0,用于标记是否找到了只出现一次的元素。然后使用两个嵌套的循环遍历数组。外层循环用于遍历每个元素,内层循环用于比较当前元素与其他元素是否相等。如果找到了一个与当前元素相等且索引不同的元素,说明当前元素不是只出现一次的元素,将flag标记为1。最后,在外层循环中判断flag的值,如果flag为0,则说明当前元素是只出现一次的元素,直接返回该元素。如果循环结束后都没有找到只出现一次的元素,则返回0

2.杨辉三角

        杨辉三角是一个数列,其第n行由 n个数字构成,每个数字等于它上方两个数字之和。首先,我们来看一下杨辉三角的定义:每一行的两侧数字都是1,中间的数字等于上一行对应位置的两个数字之和。可以使用二维数组来表示整个杨辉三角,其中第i行第j列的数字可以表示为triangle[i][j]。那么我们可以使用以下的编程思路来生成杨辉三角:

  1. 创建一个二维数组triangle,初始化为一个空的二维数组。
  2. 使用两个嵌套的循环来遍历杨辉三角的每一行和每一列,外层循环控制行数,内层循环控制列数。
  3. 在内层循环中,对于每一行的第一个位置和最后一个位置,将其值设置为1。
  4. 对于其他位置,将其值设置为其上一行对应位置的两个数字之和,即triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]。
  5. 内层循环结束后,将当前行的数组添加到triangle中。
  6. 外层循环结束后,triangle中存储的就是完整的杨辉三角

请看正确代码:

class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> triangle;if (numRows <= 0) {return triangle;}for (int i = 0; i < numRows; i++) {vector<int> row(i+1, 1); // 初始化每一行为1for (int j = 1; j < i; j++) {row[j] = triangle[i-1][j-1] + triangle[i-1][j]; // 计算其他位置的值}triangle.push_back(row); // 将当前行添加到triangle中}return triangle;}
};

         这段代码使用了一个二维数组triangle来存储杨辉三角的每一行的数字。首先判断numRows的值,如果小于等于0,则直接返回空的triangle。然后,使用两个嵌套的循环来遍历杨辉三角的每一行和每一列。外层循环控制行数,内层循环控制列数。在内层循环中,对于每一行的第一个位置和最后一个位置,将其值设置为1。对于其他位置,将其值设置为其上一行对应位置的两个数字之和。内层循环结束后,将当前行的数组添加到triangle中。最后返回triangle即可得到完整的杨辉三角。这段代码的时间复杂度为O(numRows^2),其中numRows为所要生成杨辉三角的行数。因为需要使用两个嵌套的循环来遍历杨辉三角的每一行和每一列,时间复杂度较高。

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

删除有序数组中的重复项可以使用双指针的方法来实现。具体的编程思路如下:

  1. 初始化两个指针:一个指针i用于遍历整个数组,另一个指针j用于指向当前确定的不重复元素的位置。
  2. 从数组的第二个元素开始遍历,即i=1。
  3. 如果当前元素nums[i]与前一个元素nums[i-1]相等,表示出现了重复元素,此时指针i继续向后移动一位。
  4. 如果当前元素nums[i]与前一个元素nums[i-1]不相等,表示找到了一个不重复的元素,将其复制到指针j的位置,并将指针j向后移动一位。
  5. 重复步骤3和步骤4,直到遍历完整个数组。
  6. 返回指针j的位置+1,即为删除重复项后的数组长度。
class Solution {
public:int removeDuplicates(vector<int>& nums) {if (nums.size() == 0) {return 0;}int j = 1; // 指针j初始指向第一个不重复元素的位置for (int i = 1; i < nums.size(); i++) {if (nums[i] != nums[i-1]) {nums[j++] = nums[i]; // 复制非重复元素到指针j的位置}}return j;}
};

         这段代码使用了两个指针i和j。指针i用于遍历整个数组,指针j用于指向当前确定的不重复元素的位置。首先判断数组的长度是否为0,如果是则直接返回0。然后从数组的第二个元素开始遍历,即i=1。如果当前元素nums[i]与前一个元素nums[i-1]相等,表示出现了重复元素,此时指针i继续向后移动一位。如果当前元素nums[i]与前一个元素nums[i-1]不相等,表示找到了一个不重复的元素,将其复制到指针j的位置,并将指针j向后移动一位。重复上述步骤直到遍历完整个数组,最后返回指针j的位置+1,即为删除重复项后的数组长度。这段代码的时间复杂度为O(n),其中n为数组的长度。只需要遍历一次数组即可删除重复项,时间复杂度较低。

4.只出现一次的数字2.0

这道题和第一道题思路大概一致,只不过这里的重复次数变成了3次,还能不能使用异或呢,显然不能了,那我们第一道题的第二种方法能不能解呢?答案是可以的,那么请看示例代码:

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

        这里就不在解析了,思路和第一题的第二种方法一样。

5.只出现一次的数字3.0

思路依旧类似,只不过需要返回多个元素,只需要尾插到顺序表中即可,请看示例代码:

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

        写法和前两种基本相似,不同之处在于,找到之后不会直接返回,而是尾插到顺序表中最后一块返回。

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

常规写法就是统计他们出现的总次数,然后进行判断是否大于数组长度的一半,请看示例代码:

        int count=0;for(size_t i=0;i<numbers.size();i++){count=1;for(size_t j=0;j<numbers.size();j++){if(numbers[i]==numbers[j]&&i!=j)count++; }if(count>numbers.size()/2)return numbers[i];}return 0;

        上述代码的具体的分析如下:

        1. 初始化计数变量`count`为0。
        2. 使用嵌套的循环结构遍历数组元素,外层循环是遍历数组中的每一个元素,内层循环是用来统计数组中该元素出现的次数。
        3. 对于每一个外层循环迭代的元素,首先将计数变量`count`重置为1,表示当前元素至少出现了一次。
        4. 然后通过内层循环遍历数组中的每一个元素,如果发现数组中有与当前元素相等的元素且索引不同,就将计数变量`count`加1。
        5. 在内层循环结束后,判断计数变量`count`是否超过了数组长度的一半,如果超过了则说明该元素出现次数超过了数组长度的一半,直接返回该元素。
        6. 如果没有找到出现次数超过数组长度一半的元素,最后返回0。

        这段代码的时间复杂度为O(n^2),其中n为数组的长度。因为嵌套循环的复杂度为O(n^2),每个元素都需要遍历一次数组进行统计。所以在数组较大时,性能可能比较差。

那么有没有什么简单的方法呢?

        分析一下题中的关键字“数组长度的一半“能不能想到把这个数组排序一下中间的就是我们要找的呢?哈哈,巧妙吧?那么请看示例代码吧:

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

直接对数组进行排序,取其中间值就行。

         到此我们只是简单的讲解了一下STL中vector的相关习题~,后续我们会一一展开学习的,希望这篇博客能给您带来一些启发和思考!那我们下次再一起探险喽,欢迎在评论区进行讨论~~~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智谱API调用

一、智谱API 文心一言api 千帆大模型平台 申请和使用 智谱AI开放平台 登录智谱AI开放平台&#xff0c;点击右上角的开发者工作台&#xff0c;然后查看自己的API glm-4 接口 conda create -n zhipuai python3.10 -y 二、如何使用 这边的介绍是根据官方文档的接口文档来进行介绍…

postman 工具下载安装使用教程_postman安装

本文讲解的是postman工具下载、Postman安装步骤、postman下载、postman安装教程。Postman是一款流行的API测试工具&#xff0c;它提供了一个用户友好的界面&#xff0c;用于发送和测试API请求&#xff0c;并且可以轻松地按需管理和组织请求。 这使得开发人员和测试人员能够更高…

MATLAB神经网络---lstmLayer(LSTM 长短期记忆神经网络)

前言 描述LSTM就要先描述一下循环神经网络 循环神经网络 循环神经网络通过使用带自反馈的神经元&#xff0c;使得网络的输出不仅和当前的输入有关&#xff0c;还和上一时刻的输出相关&#xff0c;于是在处理任意长度的时序数据时&#xff0c;就具有短期记忆能力。 如下是一个…

《沃趣 分手后霸道少爷宠爆我》盛大开机典礼

南京五聚文化传媒有限公司自豪地宣布&#xff0c;引人入胜的2024年度短剧巨作——《沃趣 分手后霸道少爷宠爆我》——今日正式开拍&#xff01;在星辰下的华丽舞台上&#xff0c;我们汇集了业界的精英力量&#xff0c;准备讲述一个关于爱、错位与重生的故事。 典礼精彩亮点 1.…

AttributeError: ‘ImageDraw‘ object has no attribute ‘textsize‘

python项目生成词云图的时候报错&#xff1a;AttributeError: ‘ImageDraw’ object has no attribute ‘textsize’ 解决办法 出现这个问题&#xff0c;可能是因为Pillow版本过高导致的&#xff0c;我们可以尝试通过降低Pillow的版本来解决它。 我通过将Pillow版本降低到9.4.…

微信小程序接入lottie动画

1、注意&#xff1a;canvas渲染出来的层级太高&#xff0c;当有弹窗的情况会暴露在弹窗外 模拟器上会有这个问题&#xff0c;线上版本不会有 2、需求 需要把lottie动画在小程序的环境下进行展示 3、什么是lottie动画 由Airbnb开发并开源。允许设计师将复杂的矢量动画导出为…

【单片机毕业设计选题24019】-基于STM32的安防监测灭火系统

系统功能: 1. 水泵喷水灭火功能&#xff1a;当火焰传感器监测到火焰时&#xff0c;蜂鸣器报警&#xff0c;水泵工作实现灭火。 2. 风扇功能&#xff1a;当烟雾传感器检测到CO或温度传感器检测到温度超过阈值时&#xff0c;蜂鸣器报警&#xff0c; 启动风扇进行驱散烟雾或降温…

Springboot + Mybatis 实现sql打印

参照这个视频&#xff1a;https://www.bilibili.com/video/BV1MS411N7mn/?vd_source90ebeef3261cec486646b6583e9f45f5 实现mybatis对外暴露的接口Interceptor 使用Intercepts接口,这里的写法参照mybatis-plus中的拦截器写法 Intercepts({Signature(type Executor.class, m…

MDK-ARM 编译后 MAP 文件分析

本文配合 STM32 堆栈空间分布 食用更佳&#xff01; 一图胜千言。。。

Java中setLineWrap(true)和setWrapStyleWord(true)优化TextArea

在 Java Swing 开发中&#xff0c;JTextArea 是一个多行的文本区域组件&#xff0c;常用于显示和编辑大量文本。当处理长文本时&#xff0c;默认行为是不换行并且出现水平滚动条&#xff0c;这通常会降低用户体验。幸运的是&#xff0c;JTextArea 提供了两个非常有用的方法&…

哈喽GPT-4o——对GPT-4o 提示词的思考与看法

目录 一、提示词二、常用的提示词案例1、写作助理2、改写为小红书风格3、英语翻译和改写4、论文式回答5、主题解构6、提问助手7、Nature风格润色8、结构总结9、编程助手10、充当终端/解释器 大家好&#xff0c;我是哪吒。 最近&#xff0c;ChatGPT在网络上广受欢迎&#xff0c…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 5G基站光纤连接问题(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

刘亦菲新剧玫瑰的故事

刘亦菲新剧《玫瑰的故事》&#xff1a;开放结局&#xff0c;无限遐想 当刘亦菲再次踏入荧屏&#xff0c;与导演汪俊携手打造的《玫瑰的故事》便引发了无数观众的期待与关注。这部剧不仅汇聚了众多实力派演员&#xff0c;更以其独特的剧情和精致的制作成为了近期热门的话题。《…

Python中文自然语言处理(NLP)中文分词工具库之pkuseg使用详解

概要 在中文自然语言处理(NLP)中,分词是一个基础且关键的任务。pkuseg 是由北京大学开发的一个中文分词工具,专为处理现代汉语而设计。它采用了先进的深度学习技术,能够准确地进行中文分词,同时支持自定义词典和多领域分词。本文将详细介绍 pkuseg 库,包括其安装方法、…

[【机器学习】深度概率模型(DPM)原理和文本分类实践

1.引言 1.1.DPM模型简介 深度概率模型&#xff08;Deep Probabilistic Models&#xff09; 是结合了深度学习和概率论的一类模型。这类模型通过使用深度学习架构&#xff08;如神经网络&#xff09;来构建复杂的概率分布&#xff0c;从而能够处理不确定性并进行预测。深度概率…

机器学习第四十四周周报 SAMformer

文章目录 week44 SAMformer摘要Abstract1. 题目2. Abstract3. 网络架构3.1 问题提出3.2 微型示例3.3 SAMformer 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论6.代码复现小结参考文献 week44 SAMformer 摘要 本周阅读了题为SAMformer: Unlocking the Potential…

解决IDEA使用卡顿的问题,设置JVM内存大小和清理缓存

解决IntelliJ IDEA中卡顿问题&#xff0c;可以尝试以下几个常见且有效的步骤&#xff1a; 1 增加IDEA的JVM内存分配&#xff1a; 位于IDEA安装目录的bin文件夹下&#xff0c;找到对应的操作系统配置文件&#xff08;idea64.exe.vmoptions&#xff08;Windows&#xff09;或id…

GD32错误调试篇:串口通讯乱码/stm32移植到GD32后串口通讯乱码等问题

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 向上代码兼容GD32F450ZGT6中使用 后续项目主要在下面该专栏中发布&#xff1a; https://blog.csdn.net/qq_62316532/category_12608431.html?spm1001.2014.3001.5482 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转…

PostgreSQL源码分析——initdb

数据库初始化 在安装完数据库后&#xff0c;需要进行初始化数据库操作&#xff0c;对应PostgreSQL数据库中就是需要进行initdb后&#xff0c;才能对数据库进行启动。initdb的过程&#xff0c;其实就是创建数据库实例的过程&#xff0c;生成模板数据库和相应的目录、文件信息&a…

PCB设计中的via孔和pad孔

原文出自微信公众号【小小的电子之路】 在PCB设计过程中&#xff0c;经常会提到via孔和pad孔&#xff0c;下面就简单介绍一下二者的区别。 via称为过孔&#xff0c;主要起到电气连接的作用&#xff0c;用于网络在不同层的导线之间的连接。PCB设计中一般做盖油处理。 via孔 vi…