【C++】速通涉及 “vector” 的经典OJ编程题

【C++】速通涉及 “vector” 的经典OJ编程题

【C++】速通涉及 “vector” 的经典OJ编程题

一. 杨辉三角

本题LeetCode链接:

在这里插入图片描述

解题思路:

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

代码实现:

classSolution{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);//将开辟的空间全初始化为1 arr[i].resize(i +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)插入到原数组中

代码实现:

classSolution{public:intremoveDuplicates(vector<int>& nums){int index =1;for(int i =0; i < nums.size()-1; i++)//注意下面的i + 1越界情况{if(nums[i]!= nums[i +1]){ nums[index]= nums[i +1]; index++;}}//由于一旦发生交换后index就会++;所以此时index的大小就为最终长度return index;}};

【C/C++】按位运算符使用规制

1. 按位与(&):两个相应的二进制位都为1时,结果为1,否则为0。
2. 按位或(|):两个相应的二进制位只要有一个为1,结果为1。
3. 按位异或(^):两个相应的二进制位相异时,结果为1,相同时,结果为0。
4. 按位取反(~):对一个二进制数按位取反,即0变为1,1变为0。
5. 左移(<<):将一个二进制数的各位全部左移若干位,高位丢弃,低位补0。
6. 右移(>>):将一个二进制数的各位全部右移若干位,低位丢弃,高位补符号位

三. 只出现一次的数字

本题LeetCode链接:

在这里插入图片描述

解题思路:

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

代码实现:

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

四. 只出现一次的数字 III

本题LeetCode链接:

在这里插入图片描述

解题思路:

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

关键声明:

 s =101100~s =010011(~s)+1=010100// 根据补码的定义,这就是 -s 效果:s 的最低 1 左侧取反,右侧不变 s &-s =000100// lowbit 作者:灵茶山艾府 链接:https://leetcode.cn/problems/single-number-iii/solutions/2484352/tu-jie-yi-zhang-tu-miao-dong-zhuan-huan-np9d2/ 来源:力扣(LeetCode) 

代码实现:

classSolution{public: vector<int>singleNumber(vector<int>& nums){ size_t sum =0;for(auto ch : nums){ sum ^= ch;}//只保留一个二进制数最低位的1,其他位均为0; size_t lowbit = sum &-sum;//此处要用size_t,解决溢出情况int type1 =0,type2 =0;//此处不可以用size_t,与vector<int>不匹配for(auto ch : nums){if(lowbit & ch){ type1 ^= ch;}else{ type2 ^= ch;}}return{type1, type2};//vector<int> ans(2,0);//for(auto ch : nums)//{//ans[(ch & lowbit) == 0] ^= ch; //}//return ans;}};

Read more

Java内功修炼(2)——线程安全三剑客:synchronized、volatile与wait/notify

Java内功修炼(2)——线程安全三剑客:synchronized、volatile与wait/notify

1.线程安全 1.1 概念&示例 概念:指在多线程环境下,某个代码、函数或对象能够被多个线程同时调用或访问时,仍能保持正确的行为和数据一致性。简单来说,线程安全的代码在多线程环境下运行可靠,不会因线程间的交互而产生不可预测的结果 示例: publicclassThreadDemo{publicstaticint count =0;publicstaticvoidmain(String[] args)throwsInterruptedException{Thread thread1 =newThread(()->{for(int i =0; i <500000; i++){ count++;}});Thread thread2 =newThread(()->{for(int i =0; i <500000;

By Ne0inhk
Java 中间件:Redis 分布式限流器(Redisson RateLimiter)

Java 中间件:Redis 分布式限流器(Redisson RateLimiter)

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Java中间件这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Java 中间件:Redis 分布式限流器(Redisson RateLimiter) 🚦 * 什么是限流?为什么需要分布式限流? 🤔 * 限流的定义 * 单机限流 vs 分布式限流 * Redisson 简介:不只是 Redis 客户端 🧰 * Redisson RateLimiter 核心原理 🔍 * Redis 内部数据结构 * 限流流程图(Mermaid) * 快速上手:第一个 Redisson RateLimiter 示例 🚀 * 1. 添加依赖 * 2. 配置 RedissonClient * 3. 创建并使用 RateLimiter * 输出示例:

By Ne0inhk
Java 程序员的 AI 进阶:用 Deeplearning4j 打造工业级推荐引擎

Java 程序员的 AI 进阶:用 Deeplearning4j 打造工业级推荐引擎

文章目录 * 🎯 Java 程序员的 AI 进阶:用 Deeplearning4j 打造工业级推荐引擎 * 📊 1. 为什么 Java 依然是 AI 工程化的“定海神针”? * 🧬 1.1 内存管理的“物理隔离” * 🛡️ 1.2 工业级生态的无缝闭环 * 🌍 2. 数据预处理:AI 模型的“洗经伐髓” * 🧬 2.1 特征工程的“物理建模” * 📊 推荐数据流转对比表: * 🔄 3. ND4J 内核:压榨 JVM 的每一分算力 * 🧬 3.1 堆外内存与 BLAS 加速 * 🏗️ 4. 代码实战:用 DL4J 构建神经网络推荐器 (Neural CF)

By Ne0inhk
JSP技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统

JSP技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统

Jsp技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统 * 前言 * 一、什么是JSP * 1.1 JSP是干什么的? * 1.2 JSP与Servlet的关系是什么? * 二、在Idea中创建第一个JSP系统 * 三、JSP和HTML的差别 * 3.1 格式区别 * 3.2 注释区别 前言 * 在前面的内容中,我们已经系统学习了 Web 开发的基础技术:从构建网页骨架的 HTML、美化页面的 CSS,到实现服务器端逻辑的 Java Servlet。 * 这些知识为我们打开了动态 Web 开发的大门,让我们能够通过 Servlet 处理客户端请求、操作数据库并返回动态数据。 * 然而,在 Servlet 中直接拼接 HTML 代码实现页面渲染时,代码往往显得繁琐且难以维护 —— 有没有一种更简洁、更直观的方式,

By Ne0inhk