C++:vector(题目篇)

文章目录

  • 前言
  • 一、只出现一次的数字
  • 二、只出现一次的数字 II
  • 三、只出现一次的数字 III
  • 四、杨辉三角
  • 五、删除有序数组中的重复项
  • 六、数组中出现次数超过一半的数字
  • 七、电话号码的字母组合
  • 总结


前言

今天我们一起来看vector相关的题目~
在这里插入图片描述


一、只出现一次的数字

只出现一次的数字

经典的单身狗问题,不断异或就好啦~

在这里插入图片描述

可以使用 位运算中的异或操作 来解决这个问题。异或操作有几个重要的性质:

  1. 任意数与 0 异或的结果是它本身,即 a ^ 0 = a
  2. 任意数与它自己异或的结果是 0,即 a ^ a = 0
  3. 异或满足交换律和结合律,即 a ^ b ^ a = a ^ a ^ b = b

利用这些性质,我们可以将数组中所有的数字进行一次异或运算,相同的数字异或后会抵消为 0,最终剩下的就是只出现一次的那个数字。

在这里插入图片描述

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

二、只出现一次的数字 II

只出现一次的数字 II
在这里插入图片描述

  • ones 记录那些位在某一时刻出现了 一次 的状态。

  • twos 记录那些位在某一时刻出现了 两次 的状态。

  • ones ^ num:对 ones 和当前数字 num 进行异或操作更新 ones 的状态。

    • 如果 ones 中某个位是 0,而 num 中该位是 1,则该位变为 1,表示该位出现了一次。
    • 如果 ones 中某个位是 1,而 num 中该位也是 1,则该位变为 0,表示该位出现了两次(此时我们需要把该位交给 twos 追踪)。
  • & ~twos:这是最关键的一步。

    • 这一步的目的是清除 ones 中那些已经出现在 twos 中的位(即某个位已经出现了 两次),因为这些位不再属于“只出现一次”的范围。
    • ~twos 的作用是对 twos 中的位进行按位取反(~ 是按位取反操作),这样 twos 中原本是 1 的位就变成了 0,原本是 0 的位就变成了 1
    • 然后将 ones~twos 进行按位 与操作(&),确保那些在 twos 中为 1 的位在 ones 中被清除掉。具体说:
      • 如果 twos 中某个位是 1(表示该位已经出现了两次),那么 ~twos 中对应位为 0,与 ones 进行按位与时,这个位在 ones 中会被清零(清除这位)。
      • 如果 twos 中某个位是 0,那么 ~twos 中对应位为 1,此时 ones 中该位的状态保持不变。

twos = (twos ^ num) & ~ones

  • twos ^ num:对 twos 和当前数字 num 进行异或操作,更新 twos 的状态。

  • & ~ones:这一步与 & ~twos 类似,作用是清除 twos 中那些已经出现在 ones 中的位(即只出现一次的位)。

  • & ~twos 确保 ones 中只记录那些出现 一次 的位,将出现两次的位从 ones 中清除。

  • & ~ones 确保 twos 中只记录那些出现 两次 的位,将只出现一次的位从 twos 中清除。

在这里插入图片描述

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

三、只出现一次的数字 III

只出现一次的数字 III
在这里插入图片描述

在这里插入图片描述

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {int xorsum = 0;for (int num: nums) {xorsum ^= num;}// 防止溢出int lsb = (xorsum == INT_MIN ? xorsum : xorsum & (-xorsum));int type1 = 0, type2 = 0;for (int num: nums) {if (num & lsb) {type1 ^= num;}else {type2 ^= num;}}return {type1, type2};}
};

四、杨辉三角

杨辉三角
在这里插入图片描述

这段代码是C语言的风格,用到了二级指针,而且开空间很不方便
在这里插入图片描述

这段代码是C++vector的风格,vector不用我们手动开辟空间,调用接口,既可以达到开空间的效果。
在这里插入图片描述

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

五、删除有序数组中的重复项

删除有序数组中的重复项

属于双指针的思想~
前面有讲解

在这里插入图片描述

int removeDuplicates(int* nums, int numsSize) {if(numsSize == 1){return 1;}int k = 1;int slow = 0;int fast = 0;for(int i = 0; i<numsSize; i++){if(nums[slow] == nums[fast]){fast++;}else{nums[k] = nums[fast];slow = fast;fast++;k++;}}return k;
}

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

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

这个直接排序,中间的数就是出现超过一半的数~
在这里插入图片描述

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

七、电话号码的字母组合

电话号码的字母组合

在这里插入图片描述
代码讲解:

1. 映射部分 (strA 数组):
strA 数组用于存储数字到字母的映射关系,模拟了手机按键的布局:

  • strA[2] = "abc" 表示数字 2 对应的字母为 “abc”。
  • strA[3] = "def" 表示数字 3 对应 “def”,依此类推。

这个映射数组中的索引值对应于按键上的数字,数字从 2 到 9 各自映射到一组不同的字母。而数字 0 和 1 对应空字符串,因为题目中 1 不映射到任何字母。

2. 递归组合部分 (Combine 函数):
该函数通过递归的方式生成所有可能的字母组合。

  • level 参数表示当前递归的层级(即当前处理的数字索引)。
  • combine_str 是当前已组合好的字符串。

递归的步骤如下:

  1. 如果当前 level 等于 digits 的长度,说明已经处理完所有的数字,将当前生成的组合字符串 combine_str 添加到 ansA 结果集中。
  2. 取出当前数字(digits[level])对应的字母(通过 strA 获取),并依次与前面已经组合好的字符串拼接。
  3. 通过递归调用,将处理移动到下一个数字,直到组合出所有可能的字母排列。

这个地方其实是一个全排列:
在这里插入图片描述

这里递归调用展开图是这样的:
递归遍历通过层层递进的方式,依次处理每个数字对应的字母,将当前构造的组合传递到下一层,直到所有数字都处理完为止。在每次递归中,当前数字的每个字母都与之前的组合拼接,递归到最深处时,完成一组字母组合并添加到结果中。
在这里插入图片描述

class Solution {
public://数字与字母间的映射string strA[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};//返回所有组合void Combine(int level, string digits, string combine_str, vector<string>& ansA){if(level == digits.size()){ansA.push_back(combine_str);return;}int nums = digits[level] - '0';string str = strA[nums];for(int i = 0; i < str.size(); i++){Combine(level + 1, digits, combine_str + str[i], ansA);}}vector<string> letterCombinations(string digits) {vector<string> ansA;if(digits.empty())return ansA;Combine(0, digits, "", ansA);return ansA;}
};

总结

谢谢大家~

在这里插入图片描述

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

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

相关文章

echarts 中添加图片/图标

let myChart echarts.init(this.$refs.chartOne); // 注意这里的 ref 引用 myChart.setOption({ tooltip: {trigger: item,formatter: {b} : {c}},series: [{type: pie,radius: 50%,data: this.swjList,label: {formatter: (params) > {if (params.name ! ) {let percent…

程序设计基础I-实验7 函数(编程题)

7-1 sdut- C语言实验—计算表达式 计算下列表达式值&#xff1a; 输入格式: 输入x和n的值&#xff0c;其中x为非负实数&#xff0c;n为正整数。 输出格式: 输出f(x,n)&#xff0c;保留2位小数。 输入样例: 3 2输出样例: 在这里给出相应的输出。例如&#xff1a; 2.00 …

JUC高并发编程11:Fork/Join分支合并框架

1 Fork/Join 框架简介 Fork/Join 框架是 Java 7 引入的一种并行编程框架&#xff0c;用于将一个大任务拆分成多个小任务进行并行处理&#xff0c;最后将子任务的结果合并成最终的计算结果。Fork/Join 框架的核心思想是将任务递归地分解为更小的子任务&#xff0c;直到子任务足…

Zilliz获Forrester报告全球第一;OB支持向量能力;Azure发布DiskANN;阿里云PG发布内置分析引擎

重要更新 1. Azure发布PostgreSQL向量索引扩展DiskANN&#xff0c;声称在构建HNSW/IVFFlat索引上&#xff0c;速度、精准度都超越pg_vector&#xff0c;并解决了pg_vector长期存在的偶发性返回错误结果的问题( [1] )。 2. 阿里云RDS PostgreSQL 发布AP加速引擎&#xff08;rds…

Rust编程的函数

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 7.1 函 数 定 义 在Rust中&#xff0c;函数使用fn关键字定义&#xff0c;后跟函数…

干货资料速来领取!!

关于【中国ICD行业 PLM市场研究报告】: 作为电子产业的工业粮食,ICD(集成电路设计)是一个高度专业化的领域,当前已广泛应用于计算机、通信、消费电子、汽车、医疗设备等多个行业。 近年来,国家发布多项积极政策,助推行业快速发展来提升自主可控技术及国际市场竞争力,…

数字创意的孵化器:西安园区打造创意产业生态圈

在数字创意蓬勃发展的时代浪潮中&#xff0c;西安犹如一颗闪耀的新星&#xff0c;凭借着独特的园区建设&#xff0c;为数字创意产业注入无限活力。其中&#xff0c;西安数字创意孵化园区正发挥着不可替代的重要作用&#xff0c;尤其是西安国际数字影像产业园&#xff0c;更是成…

卡门涡街,大自然的诗意律动

1959年8月14日&#xff0c;人类拍摄了地球的首张卫星图像。半个多世纪后&#xff0c;地球已经被上万颗卫星环绕&#xff0c;传回的自拍也越来越清晰。2009年&#xff0c;美国宇航局对过去50年的地球卫星图进行评选&#xff0c;排第一名的是这一张&#xff0c;太平洋上的风流过阿…

面试还搞不懂redis,快看看这40道面试题

Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型&#xff1f; 3、使用 Redis 有哪些好处&#xff1f; 4、Redis 相比 Memcached 有哪些优势&#xff1f; 5、Memcache 与 Redis 的区别都有哪些&#xff1f; 6、Redis 是单进程单线程的&#xff1f; 7、一个字符串类…

食品研发PLM系统是什么?三品PLM食品行业解决方案详情介绍

在快速变化的食品行业中&#xff0c;企业面临着诸多挑战&#xff0c;特别是在产品研发管理方面。随着消费者对食品品质、健康、创新等方面需求的不断提升&#xff0c;食品企业必须在产品研发上不断创新&#xff0c;以满足市场需求。然而&#xff0c;这一过程中&#xff0c;食品…

数据分布过于集中 怎么办,python 人工智能 ,数据分析,机器学习pytorch tensorflow ,

数据分布过于集中&#xff0c;意味着数据的大部分值都聚集在某个特定区间内&#xff0c;这可能会导致统计分析的结果不够稳健&#xff0c;或者模型训练时出现过拟合等问题。针对这种情况&#xff0c;可以考虑以下几种方法来处理&#xff1a; 变换成 1. **数据转换**&#xff1…

服装生产管理的现代化:SpringBoot框架

2 关键技术简介 2.1 JAVA技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0…

ssm某物流企业管理信息系统-计算机毕业设计源码82788

目录 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能分析 …

Windows下MYSQL8.0如何恢复root权限

误操作把root权限清掉导致数据库无法登录&#xff08;确实很难受&#xff09;&#xff0c;在网上找了很多方法&#xff0c;发现没有很行之有效的方法&#xff0c;在多方尝试终于找到了适合敏感宝宝体质的方法。 C:\Users\Administrator>mysql -u root -P3307 ERROR 1045 (2…

《征服数据结构》并查集(DSU)

摘要&#xff1a; 1&#xff0c;并查集的介绍 2&#xff0c;并查集的查找 3&#xff0c;并查集的合并 1&#xff0c;并查集的介绍 并查集(Disjoint-set data structure&#xff0c;不交集数据结构)是用于处理一些不交集的合并以及查询问题&#xff0c;它是非常重要的一种数据结…

【开源】RISC-V 修改neofetch中的Host描述

neofetch 介绍 neofetch 是一款用于在终端中显示系统信息的工具&#xff0c;其主要特点是以美观的方式展示宿主机的基本信息。它通常用于展示系统的分发版本、内核版本、硬件信息、桌面环境&#xff0c;以及一些个性化的设置&#xff0c;配合 ASCII 艺术风格的 logo&#xff0…

【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第三十章 文件IO和标准IO

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

【杭州马拉松:挑战自我,突破极限的征程】

2024年11月3日&#xff0c;杭州马拉松如约而至。这场挑战自我&#xff0c;突破极限的征程&#xff0c;将在杭州这座美丽的城市揭开序幕。对于广大跑步爱好者来说&#xff0c;如何选择合适的装备参加马拉松&#xff0c;成为了备战的重中之重。 在这里&#xff0c;我要向大家推荐…

2024咸宁中、初级职称申报时间是什么时候?

根据省职改办《关于做好2023年度全省职称评审工作的通知》&#xff08;鄂职改办〔2024〕16号&#xff09;、市职改办《关于做好2024年度咸宁市专业技术职务任职资格评审工作有关事项的通知》&#xff08;咸职改办〔2024〕11号&#xff09;等文件精神&#xff0c;现就开展2024年…

Anaconda简介windows安装

Anaconda Anaconda简介1.下载anaconda2.安装anaconda3.验证是否安装成功4.运行Anaconda简介 Anaconda是一个Python发行版本,其包含了conda、Python等180多个科学包及其依赖项,它是科学计算领域非常流行的Python包以及集成环境管理的应用。它的优势主要表现在以下几个方面: …