STL-vector练习题

news2024/9/21 23:19:17

118. 杨辉三角

思路: 

杨辉三角有以下性质使我们要用到的: 

● 每行数字左右对称,由 1 开始逐渐变大再变小,并最终回到 1。

● 第 n 行(从 0 开始编号)的数字有 n+1 项,前 n 行共有 2n(n+1)个数。

● 每个数字等于上一行的左右两个数字之和,可用此性质写出整个杨辉三角。即第 n 行的第 i 个数等于第 n−1 行的第 i−1 个数和第 i 个数之和。

代码:

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);// 按行数缩减每一行个数,并全部赋值为1
        }
        
        for(int a = 2;a < numRows ;++a)
        {
            for(int b = 1;b < a ;++b)
            { // 每个数是左上方和右上方之和
                vv[a][b] = vv[a-1][b] + vv[a-1][b-1];            
            }
        }
        return vv;
    }
};

260. 只出现一次的数字 III

思路:

1、相同数异或结果是0

假设数组 nums 中只出现一次的元素分别是 x1和 x2。如果把 nums 中的所有元素全部异或起来,得到结果 x,那么一定有:x = x1 ^ x2 。这是因为 nums 中出现两次的元素都会因为异或运算的性质 a ^ b ^ b = a 抵消掉,那么最终的结果就只剩下 x1和 x2的异或和。

2、区分两个单值数字到两个数组 

在异或操作中,只有当两个数字在某一位置上的二进制值不同,结果的该位置才会是1。因此,异或结果中为1的位表示了所有数字在该位上的差异。找到最后一个1的位,可以帮助我们区分数组中只出现一次的数字。通过最后一个1的位,我们可以将数组中的数字分成两组:一组在该位上为1,另一组在该位上为0。这两组数字在该位上的差异表明,至少有一个只出现一次的数字在该位上与其他数字不同。

3、找出异或值最后一个二进制为1的位置 

a & (-a) 可以获得a最低的非0位,但需要注意整形溢出,可以用unsigned int 类型接收。

▶ 例如: 

● a的二进制原码是 0000 1010,这里最低非0位是从右往左第2位。

● -a在二进制中的表示是补码形式,即先按位取反再加1,取反得 1111 0101(反码),加1得 1111 0110(补码)。

● 原码(0000 1010) 与 补码(1111 0110) 做与运算(&),得 0000 0010,即原码 0000 1010的LSB(最低有效位)


▶ 我们发现: 

● 原码最低非0位右边所有的0,经由取反后全部变为1,反码+1会导致这些1逐位发生进位并变为0,最终进位记到最低非0位

● 原最低非0位是1,取反后是0,进位到这一位0变成1,不再向左进位

● 原最低非0位左边的每一位经由取反后 和 原码 进行与运算必为0

4、处理这两个数组

对于提供的整数数组的其他数,相同的数在所找到的mask位置的二进制数肯定是相同的,所以会被分到同一个数组。分别对两个数组进行异或操作就能得到最终两个单值。

代码:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        //取反操作就会在无符号整数的范围内进行,
        //对-2,147,483,648 这个最小值取反时,会超出了int类型能表示的范围
        unsigned int xornum = 0;
        // 全部异或,相同的数会被异或成0
        for (int n : nums) {
            xornum ^= n;
        }
        // mask掩码:找出异或值最后一个二进制为1的数字 (重要位置)
        int mask = xornum & (-xornum);
       
       // 使用 vector 来存储结果
        vector<int> res(2, 0); 
        // 如果要用数组存储,最后返回值要写改成vector :
        //int res[2] = {0, 0};
        ...
        //return vector<int> {res[0],res[1]};

        for (int n : nums) {
            if ((n & mask) == 0) {
                // 重要位置的数字是0,放在数组中全部异或,会剩下一个单值
                res[0] ^= n;
            } else {
                // 重要位置的数字是1,放在数组中全部异或,会剩下另一个单值
                res[1] ^= n;
            }
        }
        return res;
    }
};

137. 只出现一次的数字 II

思路:

考虑数字的二进制形式,对于出现三次的数字,各二进制位出现的次数都是3的倍数。因此,统计所有数字的各二进制位中1的出现次数,并对3求余,结果为出现一次的数字。

方法:遍历统计

● 使用与运算,可获取二进制数字n的最右一位n1: n1 = n&i

● 配合右移操作,可获取n的所有为的值:n = n >> 1

● 建立一个32位的数组counts,通过以上方法可记录所有数字的各二进制位的 1 的出现次数

int[] counts = new int[32];
for(int i = 0; i < nums.length; i++) {
    for(int j = 0; j < 32; j++) {
        counts[j] += nums[i] & 1; // 更新第 j 位
        nums[i] >>= 1; // 第 j 位 --> 第 j + 1 位
    }
}

● 将counts各元素对3求余,成三出现的数字在%3操作后没有余数,则结果为“只出现一次的数字”的二进制位。

for(int i = 0; i < 32; i++) {
    counts[i] %= 3; // 得到 只出现一次的数字 的第 (31 - i) 位 
}

● 利用左移操作和或运算,可将counts数组中个二进制位的值恢复到数字res上。

for(int i = 0; i < counts.length; i++) {
    res <<= 1; // 左移 1 位
    res |= counts[31 - i]; // 恢复第 i 位的值到 res
}

代码:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        vector<int> counts(32,0);
        for(int n : nums)
        {
            for(int j = 0;j < 32 ; j++)
            {
                //n的最低位是0,那么n&1的结果是0
                //n的最低位是1,那么n&1的结果是1
                counts[j] += n & 1;//统计该位二进制数是1的个数
                //>>> 是一个无符号右移操作符,与有符号右移操作符 >> 不同的是,
                //无符号右移不考虑符号位,无论 num 是正数还是负数,左边空出的位都填充 0。
                n >>= 1;//从右向左依次取二进制数
            }
        }
        //成三出现的数字在%3操作后没有余数,只留下那个只出现一次的数字的二进制表示
        for(int i = 0;i < 32;i++)
        {
            counts[i] %= 3;
        }

        int res = 0;
        for(int i = 0;i < 32;i++)
        {
            //左移:最右边空出的位会被填充为0(无符号数)或保持符号位的值(有符号数)
            res <<= 1;
            res |= counts[31 - i];//或运算:比较的位中至少有一个为1,则结果位为1
            // 这里是31 - i,要注意二进制数存储的先后
        }
        return res;
    }
};

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

左右指针即可!

代码: 

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size() == 0)
            return 0;
        int left = 1,right = 1;
        while(right < nums.size())
        {
            if(nums[right] != nums[right-1])
            {
               nums[left++] = nums[right];
            }
            ++right;
        }
        return left;
    }
};

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

数组中出现次数超过一半的数字_牛客题霸_牛客网

思路:

计数排序的思想numbers数组的值与counts数组下标相同时对counts[ ]进行计数,最后将存储的计数与原数组长度的一半进行对比。

 注意这里创建新数组要开辟动态的,根据所给数组的最大值进行创建。

代码:

#include <algorithm>
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int>& numbers) {
        if (numbers.empty()) 
            return 0;

        //动态数组
        int maxnum = 0;
        for(int m : numbers)
        {// 找到数组中的最大值
            maxnum = max(maxnum,m);
        }
        //初始化数组
        vector<int> counts(maxnum + 1,0);
        for(int i :numbers)
        {// 计数
            counts[i]++;
        }
        for(int j = 0; j < counts.size();j++)
        {
            if(counts[j] > numbers.size()/2)
            {
                return j;
            }
        }
        return 0;
    }
};

17. 电话号码的字母组合(666)

思路: 

对于示例1,我们利用树的形式表示出来,但实现这个过程要用到递归的思想​​​​​​​

维护一个字符串,表示已有的字母排列,该字符串初始为空。每次取电话号码的一位数字,从字符串数组中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面。(即一个一个取第一个号码对应的字母,并与另一个号码对应字母一个一个结合)然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字。

代码: 

class Solution {
    string Number[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; 
    //深度优先遍历,递归实现,像树一样往深找
    void dfs(int i,int len, string digits,string& path,vector<string>& ans)
    {
        if(i == len)
        {//直到找到所有组合
            ans.push_back(path);//两两组合后尾插到动态数组
            return;
        }
        for(auto e : Number[digits[i] - '0'])//根据下标找到对应数字的字符串
        {
            path[i] = e;
            dfs(i+1,len,digits,path,ans);//注意这里是+1,不是++,用来维护一个字符串
        }
    }
public:
    vector<string> letterCombinations(string digits) {
        int len = digits.length();
        if(len == 0)
            return {};
        vector<string> ans;
        string path(len,0);

        dfs(0,len,digits,path,ans);
        return ans;
    }
};

 这一篇写了好久~  (ಥ﹏ಥ)  (ಥ﹏ಥ)  (ಥ﹏ಥ) 

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

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

相关文章

linux重要文件

/etc/sysconfig/network-scripts/ifcfg-eth1 网卡重启 /etc/init.d/network restart ifup ethname & ifdown ethname /etc/resolv.conf 设置Linux本地的客户端DNS的配置文件 linux客户端DNS可以在网卡配置文件(/etc/sysconfig/network/ifcfg-eth0 DNS2)里配置 也可以在/et…

SSY20240916提高组T1题解__贪心+大模拟

题面 题面描述 fe和xt在玩一个游戏, 在 n m n\times m nm的网格图上进行. 定义 ( a , b ) , ( c , d ) (a,b)\;,\;(c,d) (a,b),(c,d)见距离为 ∣ a − c ∣ ∣ b − d ∣ |a-c||b-d| ∣a−c∣∣b−d∣ 现在游戏按照以下步骤进行: xt选择 k k k个格子fe选择一个格子(不能选…

QT + WebAssembly + Vue环境搭建

Qt6.7.2安装工具 emsdk安装 git clone https://github.com/emscripten-core/emsdk.git cd emsdk emsdk install 3.1.50 emsdk activate 3.1.50 Qt Creator配置emsdk 效果 参考 GitHub - BrockReece/vue-wasm: Vue web assembly loader Emscripten cmake多版本编译-CSDN博客 …

【数据结构】排序算法---希尔排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 结语 1. 定义 希尔排序&#xff08;英语&#xff1a;Shell sort&#xff09;&#xff0c;也称为缩小增量排序法&#xff0c;是[直接插入排序]的一种改进版本。希尔排序以它的发明者希…

优化最长上升子序列

前言&#xff1a;平时我们做的题目都是用动态规划做的&#xff0c;但是有没有能够优化一下呢&#xff1f; 有一个结论&#xff0c;长度为 i 的一个序列&#xff0c;最后一个元素一定是构成长度为 i 的序列中最小的 我们可以用二分来优化 题目地址 #include<bits/stdc.h>…

【设计模式】创建型模式(四):建造者模式

创建型模式&#xff08;四&#xff09;&#xff1a;建造者模式 1.概念2.案例3.优化 1.概念 建造者模式 是一种创建型设计模式&#xff0c;它允许你创建复杂对象的步骤与表示方式相分离。 建造者模式是一种创建型设计模式&#xff0c;它的主要目的是将一个复杂对象的 构建过程…

极速上云2.0范式:一键智连阿里云

在传统上云的现状与挑战&#xff1a; 专线上云太重&#xff0c;VPN上云不稳&#xff0c;云上VPC&#xff0c;云下物理网络&#xff0c;多段最后一公里...... 层层对接&#xff0c;跳跳延迟&#xff0c;好生复杂! 当你试图理解SD-WAN供应商和阿里云的文档&#xff0c;以协调路由…

7-ZIP工具的功能分享:合并分卷压缩文件

在日常工作中&#xff0c;有些大文件无法单独传输&#xff0c;我们通常会通过压缩拆分成多个分卷文件来完成传输。 当完成传输后&#xff0c;不想要这么多分卷文件的时候&#xff0c;就可以通过7-ZIP工具的合并功能来解决这个问题。下面一起来看看&#xff0c;具体如何操作。 …

【C++算法】位运算

位运算基础知识 1.基础运算符 << : 左移 >> : 右移 ~ : 取反 & : 按位与&#xff0c;有0就是0 I : 按位或&#xff0c;有1就是1 ^ : 按位异或&#xff0c;&#xff08;1&#xff09;相同为0&#xff0c;相异为1&#xff08;2&#xff09;无进位相加 2.…

【docker】阿里云使用docker,2024各种采坑

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ dial tcp: lookup on 8.8.8.8:53: no such host失败属于DNS问题 2️⃣ docker镜像配置配置最新镜像源 3️⃣ 【重点】阿里云专用获取自己的镜像加速器地址配置镜像地址 &#x1f6ec; 文章小结&#x1f4d6; 参考资料 &#x…

MySQL_SQLYog简介、下载及安装(超详细)

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

如何设置xshell关闭最后一个选项卡标签时不退出软件?

不知道你是否遇到这个问题&#xff0c;就是在使用xshell的时候&#xff0c;每次关闭最后一个选项卡标签的时候&#xff0c;xshell软件默认就退出了&#xff0c;好多次我都只是想要关闭&#xff0c;而非退出&#xff0c;所以该如何设置&#xff0c;才能到我们的预期的效果呢&…

re题(23)BUUFCTF-[FlareOn4]login

BUUCTF在线评测 (buuoj.cn) 下载后打开看到是一个txt和一个html 分别打开看看&#xff0c;txt是提示&#xff0c;html应该就是要破解的网页 打开网页&#xff0c;查看源代码 找到程序&#xff0c;变灰的部分是关键&#xff0c;是指如果是前13个字母就加13&#xff0c;如果是…

手机端跑大模型:Ollma/llama.cpp/vLLM 实测对比

昨天给大家分享了&#xff1a;如何在手机端用 Ollama 跑大模型 有小伙伴问&#xff1a;为啥要选择 Ollama&#xff1f; 不用 Ollama&#xff0c;还能用啥&#xff1f;据猴哥所知&#xff0c;当前大模型加速的主流工具有&#xff1a;Ollama、vLLM、llama.cpp 等。 那我到底该…

鸿蒙版 React Native 正式开源,ohos_react_native 了解一下

距离鸿蒙 Next 宣布一年后&#xff0c;除了 Flutter 的鸿蒙支持之外&#xff0c;React Native 的社区支持的 ohos_react_native 也终于在 OpenHarmony-SIG 对外开源&#xff0c;并且和 Flutter 不同在于&#xff0c;本次开源的版本是基于 React Native 0.72.5 。 ohos_react_n…

算法——贡献法

前天的AtCoder Beginner Contest 371 D题碰到了这个贡献法&#xff0c;刚好之前的第十一届蓝桥杯省赛第二场真题AcWing 2868. 子串分值也是用的这个方法hh,但是赛时没有搞出来。。。 AcWing 2868. 子串分值 对于一个字符串 SS&#xff0c;我们定义 SS 的分值 f(S)f(S) 为 SS 中…

UDS 诊断 - TransferData(传输数据)(0x36)服务

UDS 诊断服务系列文章目录 诊断和通信管理功能单元 UDS 诊断 - DiagnosticSessionControl&#xff08;诊断会话控制&#xff09;&#xff08;0x10&#xff09;服务 UDS 诊断 - ECUReset&#xff08;ECU重置&#xff09;&#xff08;0x11&#xff09;服务 UDS 诊断 - SecurityA…

芯片制造过程(科普版)

tip&#xff1a;是搬运过来的&#xff0c;vx公众号&#xff1a;胖虎说可科普(感觉它的视频也是不知道哪里搞过来的&#xff0c;bushi) 目录 1 芯片结构2 制造过程2.1 晶圆的制造2.2 晶圆的加工2.3 掩膜电路2.4 光刻2.5 离子注入2.6 切割 封装等 最后 记录一下编写过程&#xff…

IM系统完结了,那简历该怎么写?(含简历项目描述)

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 星球项目地址&#xff1a;https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

在线仿真器ST-Link为例的整体认知

仿真器的作用 参考 简单来说&#xff0c;仿真器拥有下载和实时程序控制两个功能&#xff0c;而且下载的地址直接指向flash而不需要设置引脚启动单片机内部的bootloader程序&#xff0c;而实际中更加实用的是程序控制调试&#xff0c;这可以减少很多下载操作。 仿真器的在调试…