当前位置: 首页 > news >正文

[LeetCode][LCR178]训练计划 VI——使用位运算寻找数组中不同的数字

题目

LCR 178. 训练计划 VI

教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组 actions,其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。

  • 示例 1:

输入:actions = [5, 7, 5, 5]
输出:7

  • 示例 2:

输入:actions = [12, 1, 6, 12, 6, 12, 6]
输出:1

  • 提示:
    节点总数 <= 10000

思考

  • 不同于LCR177,这道题的数字出现的次数不是偶数次,所以不能用异或来解决

解法1——统计所有位上 “1” 出现的次数

  • 可以观察到,非目标数字出现的次数是相同的,因此我们可以选择遍历整个数组,统计每个位上 1 出现的次数,然后这个次数对非目标数字的出现次数求余,如果那一位上有目标数字的 1,则求余后应该为 1,否则求余后应该为 0,此为解法1

class Solution {
public:int trainingPlan(vector<int>& actions) {vector<int> count(32, 0);for(auto &ele:actions){for(int i=31; i>=0; --i){if(ele & 1) count[i]++;ele>>=1;}}int ans=0;for(int i=0; i<32; ++i){ans <<= 1;ans += count[i]%3;}return ans;}
};

解法2——有限状态自动机

思想来源于https://leetcode.cn/leetbook/read/illustration-of-algorithm/9hctss/,以下是个人对这个解法的笔记

  • 解法1是比较容易想到的,但是有一个缺点,就是遍历数组时,每个数字都要进行 32 次统计,且最终统计完成后又要遍历统计结果进行答案的还原
  • 能否有一种方式,可以在遍历数组的时候一次性记录完成,无需对每个数字进行 32 次统计,且最后也不需要进行答案的还原呢?
  • 对数组中每个元素进行位操作?通过对一位数字的统计,直接扩展到 32 位数字一次性统计?
    • 我们可以很简单的得出,当对数组中的一个数字的操作结束后,单独某一位上 1 的个数对 3 取余后只有 3种状态:0、1、2
    • 0、1、2 应该如何记录呢,我们考虑使用 2 位二进制数进行记录,即00、01、10
    • 但是我们的最终目的是通过位运算一次操作就得到本轮遍历到的数字的统计结果,所以我们不能简单的用连续的两位二进制数进行统计,而是使用两个 32 位数进行统计,ones记录00、01、10的第一位数,twos记录00、01、10的第二位数。即:
第一个32位数ones0000……0100
第二个32位数twos0000……0010
表示(这轮遍历后的情况)0000……0210

在这里插入图片描述
图片来自:https://leetcode.cn/leetbook/read/illustration-of-algorithm/9hctss/

  • 知道了这个统计思想,那下一步就是思考选择什么样的位运算可以得到正确的结果
  • 对ones有:
    在这里插入图片描述
    图片来自:https://leetcode.cn/leetbook/read/illustration-of-algorithm/9hctss/
    这里有一个重点就是,当位运算出现了嵌套的条件,如当two满足什么,再n满足什么等等等等这种条件,可以使用 & 来保证其中一个条件的满足,而又不影响这个要去进一步判断是否 n 满足的这个数字的值,在这里就表现为
one = one & ~two;

在这样操作后,确保 one 已经满足了 two 这个条件,然后这个结果再去与 n 异或

one = one & ~two ^ n;
  • 而 twos 的更新只需要注意当我们先更新 ones 后,twos 应该在新的 ones 上进行计算,选择位运算的方式同上

class Solution {
public:// 计算训练计划int trainingPlan(vector<int>& actions) {// 初始化变量 ones 和 twos 为 0int ones=0, twos=0;// 对于 actions 中的每一个元素 elefor(auto &ele:actions){// 计算 ones 的状态转移ones = ones ^ ele & ~twos;  // 根据当前的 ele 更新 ones 的状态// 计算 twos 的状态转移twos = twos ^ ele & ~ones;  // 根据当前的 ele 更新 twos 的状态}// 返回最终计算得到的 ones,它记录了“只出现一次的数字”的情况return ones;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 如何使用GraphQL和Apollo构建一个宝可梦应用
  • GPT4不限制使用次数了!GPT5即将推出了!
  • 使用Flutter创建带有图标提示的TextField
  • Elementplus 2.6.1表单校验模块开发体验改进
  • 【40分钟速成智能风控1】互联网金融风险管理简介
  • 场景文本检测识别学习 day01(传统OCR的流程、常见的损失函数)
  • Qt——Qt实现数据可视化之QChart的使用总结(使用QChart画出动态显示的实时曲线)
  • Layui三级联动插件使用方法
  • 数据结构之栈和队列
  • golang语言系列:Web框架+路由 之 Gin
  • ChatGPT 之优势与缺陷
  • vue3和vue2 之 provide/inject 用法区别 ---vue3组件间通讯2
  • gpt的构造和原理
  • CentOS安装MySQL数据库
  • java操作mongodb详解
  • Android Studio:GIT提交项目到远程仓库
  • Angular4 模板式表单用法以及验证
  • Consul Config 使用Git做版本控制的实现
  • css系列之关于字体的事
  • Javascript设计模式学习之Observer(观察者)模式
  • Linux后台研发超实用命令总结
  • linux学习笔记
  • Mysql优化
  • Node + FFmpeg 实现Canvas动画导出视频
  • PHP面试之三:MySQL数据库
  • SpriteKit 技巧之添加背景图片
  • ucore操作系统实验笔记 - 重新理解中断
  • Vue 重置组件到初始状态
  • vue-router 实现分析
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 使用 QuickBI 搭建酷炫可视化分析
  • 我的zsh配置, 2019最新方案
  • 新手搭建网站的主要流程
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 一道面试题引发的“血案”
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # wps必须要登录激活才能使用吗?
  • #Linux(帮助手册)
  • #pragma once
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (第二周)效能测试
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (六)vue-router+UI组件库
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (十三)Flask之特殊装饰器详解
  • (四)linux文件内容查看
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (四)软件性能测试
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)