STL-vector练习题

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;
    }
};

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用ShardingSphere实现MySql的分库分表

目录 一 什么是ShardingSphere分库分表 二 代码实现 1.导入相关依赖 2.配置相关参数 3.创建学生类以及mapper接口 4.实现 StandardShardingAlgorithm接口自定义分片算法 唐洋洋我知道你在看!!!嘿嘿 一 什么是ShardingSphere分库分表 我们平时在设计数据库的时候&#xf…

基于UDP的简易网络通信程序

目录 0.前言 1.前置知识 网络通信的大致流程 IP地址 端口号&#xff08;port&#xff09; 客户端如何得知服务器端的IP地址和端口号&#xff1f; 服务器端如何得知客户端的IP地址和端口号&#xff1f; 2.实现代码 代码模块的设计 服务器端代码 成员说明 成员实现 U…

2024 年 GitLab Global DevSecOps 报告解读

近日 GitLab 正式发布了 2024 年 GitLab Global DevSecOps 报告&#xff0c;报告主题为 What’s next in DevSecOps。在全球有超 5000 位 IT 人员参与了该报告的调研&#xff0c;超 70% 为企业管理者&#xff0c;50% 以上的受访者所在企业规模超过 500人。该报告深刻揭示了在 A…

Andrej Karpathy谈AI未来:自动驾驶、Transformer与人机融合

引言 在人工智能领域&#xff0c;Andrej Karpathy 是一个无法忽视的名字。从他早期在 OpenAI 的工作&#xff0c;到后来担任 Tesla 的 AI 主管&#xff0c;他在自动驾驶、深度学习等方面的贡献广为人知。最近&#xff0c;卡帕西做客了著名的播客节目 No Priors&#xff0c;他在…

鸿蒙开发基础

页面跳转 了解代码初始结构 /*** 装饰器&#xff1a;用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。* Entry&#xff1a;表示该自定义组件为入口组件 * Component&#xff1a;表示自定义组件* State&#xff1a;表示组件中的状态变量&#xff0c;状态变量变…

hh exe所选的程序不能与此文件类型相关联。请选择其他程序。

按照hh exe打开chm文件显示所选的程序不能与此文件类型相关联。请选择其他程序。 以上错误来自于 cmd命令行 cd C:\Windows\hh.exe 要打开的chm文件报错 其实根本原因是在设置中.chm文件默认打开方法被其他软件占用了&#xff0c;解决办法只能删除那个软件&#xff0c;如果是W…

接口测试(十二)

一、前台、后台、数据库三者关系 fiddler抓包是抓取客户端 --> 服务端 发送的的请求接口 开N个网页&#xff0c;只要有对后端发送请求&#xff0c; fiddler是无差别抓取 F12只抓取当前页面的数据 二、接口概念 接口是什么&#xff1f;— 传递数据的通道 测试系统组件间接口…

五、(JS)window中的定时器

一、为什么叫做window中的定时器 我们在全局中会用到一些函数&#xff0c;比如说alert函数&#xff0c;prompt函数&#xff0c;setTimeout等等 我们有在这里定义过这些函数吗&#xff1f;很明显没有。可见我们这些函数都是来自于window。 所以还可以写成window.setTimeout。…

AtCoder Beginner Contest 371

A - Jiro &#xff1a; 题目&#xff1a; 代码&#xff1a; #include <bits/stdc.h>using namespace std;typedef long long LL ; typedef pair<int,int> PII;void solve() {string a,b, c;cin>>a>>b>>c;string s(3,a);s[0]a[0];s[1]b[0];s[2…

Java集合(八股)

这里写目录标题 Collection 接口List 接口ArrayList 简述 1. ArrayList 和 LinkedList 区别&#xff1f;⭐️⭐️⭐️⭐️2. ArrayList 和 Array 的区别&#xff1f;⭐️⭐️⭐️ArrayList 和 Vector 区别&#xff1f;⭐️⭐️ArrayList 的扩容机制&#xff1f;⭐️⭐️⭐️ Qu…

18063 圈中的游戏

### 思路 1. 创建一个循环链表表示围成一圈的 n 个人。 2. 从第一个人开始报数&#xff0c;每报到 3 的人退出圈子。 3. 重复上述过程&#xff0c;直到只剩下一个人。 4. 输出最后留下的人的编号。 ### 伪代码 1. 创建一个循环链表&#xff0c;节点表示每个人的编号。 2. 初始…

Vue3+TS项目封装一个公共的el-table组件二次封装

前言 支持动态传入列&#xff0c;列内容可以指定插槽&#xff0c;指定格式化显示 样式没太写&#xff0c;主要分享基础功能封装 效果 Table组件代码BaseTable.vue <template><el-table :data"data" border><template v-for"col in columns&q…

通过防火墙分段增强网络安全

什么是网络分段‌ 随着组织规模的扩大&#xff0c;管理一个不断扩大的网络成为一件棘手的事情&#xff0c;同时确保安全性、合规性、性能和不间断的运行可能是一项艰巨的任务。为了克服这一挑战&#xff0c;网络管理员部署了网络分段&#xff0c;这是一种将网络划分为更小且易…

react18基础教程系列-- 框架基础理论知识mvc/jsx/createRoot

react的设计模式 React 是 mvc 体系&#xff0c;vue 是 mvvm 体系 mvc: model(数据)-view(视图)-controller(控制器) 我们需要按照专业的语法去构建 app 页面&#xff0c;react 使用的是 jsx 语法构建数据层&#xff0c;需要动态处理的的数据都要数据层支持控制层: 当我们需要…

YoloV8 trick讲解

1.将 YOLOv5 的 C3结构换成了梯度流更丰富的 C2f结构: C3 C3 模块的设计灵感来自 CSPNet&#xff0c;其核心思想是将特征图的部分通道进行分割和并行处理&#xff0c;目的是减少冗余梯度信息&#xff0c;同时保持较高的网络表达能力。C3 结构与传统的残差结构类似&#xff0c;但…

PMBOK® 第六版 定义活动

目录 读后感—PMBOK第六版 目录 定义活动的过程强调专业分工&#xff0c;将工作包分解成不同的活动&#xff0c;再由专业人员将这些活动细化为具体任务&#xff0c;分配给项目成员完成。 在软件开发项目中&#xff0c;定义活动将项目流程细化为需求分析、系统设计、编码、测试…

了解MySQL 高可用架构:主从备份

为了防止数据库的突然挂机&#xff0c;我们需要对数据库进行高可用架构。主从备份是常见的场景&#xff0c;通常情况下都是“一主一从/(多从)”。正常情况下&#xff0c;都是主机进行工作&#xff0c;从机进行备份主机数据&#xff0c;如果主机某天突然意外宕机&#xff0c;从机…

CPU 和 GPU:为什么GPU更适合深度学习?

目录 什么是 CPU &#xff1f; 什么是 GPU &#xff1f; GPU vs CPU 差异性对比分析 GPU 是如何工作的 &#xff1f; GPU 与 CPU 是如何协同工作的 &#xff1f; GPU vs CPU 类型解析 GPU 应用于深度学习 什么是 CPU &#xff1f; CPU&#xff08;中央处理器&#xff09;…

学习大数据DAY57 新的接口配置

作业  完成 API 接口和文件的接入, 并部署到生产调度平台, 每个任务最后至少 要有两条 不报错 的日志, 报错就驳回作业  作业不需要复制日志 API Appliation Program Interface 应用程序接口 > JSON 的地址 客户需求: 把 https://zhiyun.pub:9099/site/c-class…

nginx安装及vue项目部署

安装及简单配置 在usr/local下建好nginx文件夹&#xff0c;下载好nginx-1.26.2.tar.gz压缩文件.安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c libtool openssl openssl-devel pcre-devel gcc、gcc-c # 主要用来进行编译相关使用 openssl、ope…