跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 经典 OJ 编程题解析:Vector 应用与位运算技巧

通过四个经典 OJ 题目讲解 C++ 中 Vector 容器及位运算的应用。涵盖杨辉三角的二维数组构建、有序数组去重的双指针技巧、利用异或特性查找单一数字及其变种问题。同时补充了常用按位运算符的定义与使用规范,提供完整代码实现与思路分析,帮助读者巩固基础算法知识。

ByteFlow发布于 2026/3/28更新于 2026/10/24103 浏览
C++ 经典 OJ 编程题解析:Vector 应用与位运算技巧

C++ 经典 OJ 编程题解析:Vector 应用与位运算技巧

一、杨辉三角

本题 LeetCode 链接

解题思路

利用 vector 的特性创建一个二维数组,通过观察得知杨辉三角的第 0 行第 0 列全为 1,其他位置元素的值都等于其上一行同列元素与上一行前一列元素的和。

代码实现

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> arr(numRows);
        for (int i = 0; i < numRows; i++) {
            arr[i].resize(i + 1, 1);
            arr[i][0] = arr[i][i] = 1;
        }
        // 第一、二行的元素都是 1,从第 3 行,第 2 列开始循环
        for (int i = 2; i < numRows; i++) {
            for (int j = 1; j < i; j++) {
                arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
            }
        }
        return arr;
    }
};

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

本题 LeetCode 链接

解题思路

比较相邻的两个元素是否相等,若不相等则依次从原数组第二个位置(即变量 index,下标为 1)插入到原数组中。

代码实现

class Solution {
public:
    int  {
         index = ;
         ( i = ; i < nums.() - ; i++) {
             (nums[i] != nums[i + ]) {
                nums[index] = nums[i + ];
                index++;
            }
        }
        
         index;
    }
};
removeDuplicates
(vector<int>& nums)
int
1
for
int
0
size
1
if
1
1
// 由于一旦发生交换后 index 就会++;所以此时 index 的大小就为最终长度
return
【C/C++】按位运算符使用规范
  1. 按位与 (&):两个相应的二进制位都为 1 时,结果为 1,否则为 0。
  2. 按位或 (|):两个相应的二进制位只要有一个为 1,结果为 1。
  3. 按位异或 (^):两个相应的二进制位相异时,结果为 1,相同时,结果为 0。
  4. 按位取反 (~):对一个二进制数按位取反,即 0 变为 1,1 变为 0。
  5. 左移 (<<):将一个二进制数的各位全部左移若干位,高位丢弃,低位补 0。
  6. 右移 (>>):将一个二进制数的各位全部右移若干位,低位丢弃,高位补符号位。

三、只出现一次的数字

本题 LeetCode 链接

解题思路

0 异或任何一个数的结果为该数本身,两个相同的整数异或结果为 0。

代码实现

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

四、只出现一次的数字 III

本题 LeetCode 链接

解题思路

由于给定的整数序列中恰好有两个元素只出现一次,其余所有元素均出现两次。将全部元素异或到 sum 中就是这两个元素的异或结果。由于这两个数不相等,那么异或的结果 sum 中至少有一个二进制比特位的值为 1。找到结果 sum 中最低的且值为 1 的比特位,并且把 sum 中的其他比特位都改变为 0 得到 lowbit(通过 sum & -sum 得到 lowbit)。这就是这两个不同的元素的区别,再利用按位与 (&) 的特征来找到这两个不同的元素。此时用 lowbit 的唯一的数值为 1 的比特位来作为判断条件,分别用两个 0 异或原数组中的所有元素,由于其他元素均出现且只出现了两次,不管异或到哪个 0 这两个相同整数异或结果都是 0,不会影响到最终要找的这两个不同元素。

代码实现

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        size_t sum = 0;
        for (auto ch : nums) {
            sum ^= ch;
        }
        // 只保留一个二进制数最低位的 1,其他位均为 0
        size_t lowbit = sum & -sum;
        int type1 = 0, type2 = 0;
        for (auto ch : nums) {
            if (lowbit & ch) {
                type1 ^= ch;
            } else {
                type2 ^= ch;
            }
        }
        return {type1, type2};
    }
};

目录

  1. C++ 经典 OJ 编程题解析:Vector 应用与位运算技巧
  2. 一、杨辉三角
  3. 解题思路
  4. 代码实现
  5. 二、删除有序数组中的重复项
  6. 解题思路
  7. 代码实现
  8. 【C/C++】按位运算符使用规范
  9. 三、只出现一次的数字
  10. 解题思路
  11. 代码实现
  12. 四、只出现一次的数字 III
  13. 解题思路
  14. 代码实现

更多推荐文章

查看全部
  • AI 深度早报:GTC 开幕,AI Agent 平台与具身世界模型双线引爆
  • 2025 AIGC 最具影响力 AI 应用开发平台公布
  • 前端团队协作最佳实践
  • 考公压力大是否该放弃?程序员职业路径的理性思考
  • GitHub 汉化插件安装指南:三步实现界面中文化
  • 理解 Python 异步编程原理与 asyncio 简单实现
  • LLM 大模型学习:理解 Prompts 概念与 LangChain 快速应用技巧
  • 基于 Vue + Three.js 构建 Sonic 数字人前端交互预览系统
  • DeepSeek V3 正式发布:性能突破与开源生态解析
  • 大规模深度学习模型高效训练研究综述:五大类加速技术详解
  • 滑动窗口算法实战:最小和子数组与最长无重复子串
  • 深入理解 Linux 进程:从概念、fork 创建到内核状态
  • OpenClaw AI 编程上下文 Token 限制剖析与扩容实战
  • Agent-Reach:零成本实现 AI 跨平台互联网访问
  • 半小时基于 OpenClaw 搭建 AI 量化系统:开源三件套实测
  • 基于 LangChain 构建具备记忆功能的聊天机器人
  • 华为 OD 机试双机位 C 卷 - 叠积木
  • 大模型应用开发实战指南:基于 GPT-4 和 ChatGPT 的核心技术与实践
  • IDA Pro 远程调试指南:gdbserver 与 armlinux_server 实战
  • Android NDK 音视频开发技术路线与学习指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online