C++:vector(题目篇)

news2024/10/11 12:55:16

文章目录

  • 前言
  • 一、只出现一次的数字
  • 二、只出现一次的数字 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.coloradmin.cn/o/2204890.html

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

相关文章

Windows电脑安装FileBrowser文件管理系统结合内网穿透打造个人网盘

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&…

数据结构:单链表OJ题

目录 相交链表解题思路代码 环形链表&#xff08;I&#xff09;解题思路代码 环形链表&#xff08;II&#xff09;解题思路代码 随机链表的复制&#xff08;深拷贝&#xff09;解题思路代码 相交链表 题目描述&#xff1a; 案例&#xff1a; 题目链接&#xff1a;https://l…

从边缘云到边缘AI,似乎边缘更有想象空间,你认同么?

【科技明说 &#xff5c; 科技热点关注】 前些天&#xff0c;我看到一个业内的行业分析说&#xff0c;边缘人工智能已经开始兴起&#xff0c;但是要到了2026年才会产生影响。这就意味着边缘AI的未来值得关注一下。 什么是边缘AI&#xff1f;边缘AI就是将人工智能处理功能带到了…

怎么找矩阵系统,怎么源码搭建,源头技术开发需要哪些支持

一、引言 在进行矩阵系统源码搭建时&#xff0c;选择合适的工具至关重要。正确的工具选择不仅可以提高开发效率&#xff0c;还能确保系统的稳定性、可扩展性和性能。本文将探讨在矩阵系统源码搭建过程中如何选择合适的工具。 二、前端开发工具选择 前端框架 React&#xff1a;由…

LLM大模型怎样进行数据和质量测试

大型语言模型&#xff08;LLMs&#xff09;的四种测试策略 测试机团队需要一套针对LLM的测试策略。在为嵌入在AI agent应用中的LLMs大模型制定测试策略时&#xff0c;可以考虑以下四点实践方法&#xff1a; 1&#xff09;创建测试数据以扩展软件质量保证 2&#xff09…

C 盘又满了?试试我用的这个方法吧,轻松腾出几十个G,还有好用的工具推荐哟!

如题&#xff0c;作为具有洁癖的程序猿&#xff0c;作为具有容量焦虑症的程序猿&#xff0c;我总是希望C盘保持轻巧状态&#xff08;看来还是Mac比较省心&#xff09;&#xff0c;奈何我给了它200G的存储&#xff0c;安装的应用都保存到了D盘&#xff0c;可它还是蹭蹭飙升&…

第一个Flutter应用解析(一)

1、创建项目 1.1 新建 1.2 选择Flutter SDK的位置 1.3 项目名称 英文单词加下划线起名规范&#xff0c;其他默认即可。 1.4 点击运行 发生报错显示我们的JAVA版本不符合 1.5 更改版本设置 1.6 再次启动项目 2、分析页面代码 以下是lib/main.dart的源代码&#xff08;为了阅…

搭建企业私有云

A公司为国内知名大型瓶装饮料合资企业。2019年以前业务系统部署于IBM 的Unix小型机&#xff0c;该机型在IBM结束支持后&#xff0c;一直购买专业公司运维服务。Unix系统软件和运维成本相较Linux X86平台要高很多&#xff0c;不能满足应用轻量化和快速叠代的需求。公司原有的基础…

儿童护眼灯哪个牌子好?儿童护眼灯推荐测评教你选护眼台灯!

​据调查,我国现有盲人500多万&#xff0c;低视力近千万人&#xff0c;尤其是在儿童及青少年当中&#xff0c;患病率极高。全国学生体质健康调研最新数据表明&#xff0c;我国儿童青少年总体近视率为52.7%&#xff0c;其中&#xff0c;小学生为42%&#xff0c;初中生为80.7%&am…

机器学习【医疗领域及其药品搭建】

机器学习【医疗领域及其药品搭建】 1. 个性化医疗与精准治疗2. 药物管理2. 药物研发与创新4. 医疗图像分析与诊断辅助5. 数据安全与隐私保护6. 药物安全与风险管理7. 电子健康记录&#xff08;EHR&#xff09;的利用8. 机器人辅助手术 1. 个性化医疗与精准治疗 基因组学&#…

Leetcode 完全平方数

这段代码是用 动态规划&#xff08;Dynamic Programming, DP&#xff09;来解决 LeetCode 第279题「完全平方数」的问题&#xff0c;题目要求给定一个整数 n&#xff0c;找出若干个完全平方数&#xff08;如1, 4, 9, 16等&#xff09;的和&#xff0c;恰好等于 n&#xff0c;并…

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【314-326】

314. 动态绑定机制 【注】属性没有动态绑定机制 虽然B类sum被注释掉了&#xff0c;但是其父类A类的sum方法没被注释掉&#xff0c;所以调用的是A类的sum方法&#xff0c;A类的sum方法中有个getI()方法&#xff0c;根据动态绑定机制&#xff0c;现在这个a引用的运行类型是B类&a…

【CTF Web】Pikachu getimagesize() Writeup(文件上传+PHP+文件包含漏洞+JPEG图片马+getimagesize绕过)

不安全的文件上传漏洞概述 文件上传功能在web应用系统很常见&#xff0c;比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后&#xff0c;后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等&#xff0c;然后将其按照设计的格式进行重…

mongodb 数据迁移,亲测成功!

mysql进行数据迁移&#xff0c;最简单的不过是导出sql&#xff0c;然后在运行sql&#xff0c;数据也自然迁移过去了。 可是mongodb里&#xff0c;我们存储的是文件&#xff0c;是怎么做到的呢&#xff0c;当我在翻阅网上博客的时候&#xff0c;并没有发现有这方面的顾虑。 当…

制造业DT数字化之生产制造业务建模

一、工厂建模为何物&#xff1f; 对制造业人员&#xff08;人&#xff09;、设备&#xff08;机&#xff09;、材料&#xff08;料&#xff09;、工艺流程&#xff08;法&#xff09;、工厂环境&#xff08;环&#xff09;数据化管理的过程就叫工厂建模。 二、制造建模有哪几大…

Math.js 进阶使用:数值比较和数学运算

一. 引言 上篇文章中&#xff0c;我们了解了 Math 工具函数在数值操作方面的妙用&#xff0c;主要包括&#xff1a;取绝对值、向上向下取整以及四舍五入的方法&#xff0c;详细了解请参考上一篇文章&#xff1a; Math 工具函数的妙用&#xff1a;常用的数值操作 本篇文章将继…

【Linux系统编程】第三十弹---软硬链接与动静态库的深入探索

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、软硬链接 1.1、见一见 1.2、特征 1.3、什么是软硬链接&#xff1f;有什么用(为什么)&#xff1f; 2、动态库和静态库 2.…

从 Vim 到 VSCode:提升远程开发效率的秘密武器

1.前言 在 Linux 服务器上进行开发时&#xff0c;我们常常会选择使用 vi 或 vim 这些轻量级的编辑器。虽然它们可以满足基本的编辑需求&#xff0c;但在处理大型项目时&#xff0c;局限性很明显&#xff1a;缺乏现代编辑器的高级功能&#xff0c;比如语法高亮、代码补全以及便…

windows 调整虚拟内存文件大小,释放C盘

Windows 虚拟内存文件&#xff08;通常是 pagefile.sys&#xff09;的作用是充当物理内存&#xff08;RAM&#xff09;的扩展&#xff0c;当系统内存不足时&#xff0c;它为系统提供一个额外的、基于硬盘的存储空间。这种虚拟内存的机制帮助系统在物理内存耗尽时仍能继续运行程…

数据结构 ——— 单链表oj题:相交链表(链表的共节点)

目录 题目要求 手搓两个相交简易链表 代码实现 题目要求 两个单链表的头节点 headA 和 headB &#xff0c;请找出并返回两个单链表相交的起始节点&#xff0c;如果两个链表不存在相交节点&#xff0c;则返回 NULL 手搓两个相交简易链表 代码演示&#xff1a; struct Lis…