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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络安全之命令注入

漏洞原理&#xff1a; 应用系统设计需要给用户提供指定的远程命令操作的接口&#xff0c;比如&#xff1a;路由器&#xff0c;防火墙&#xff0c;入侵检测等设备的web管理界面。一般会给用户提供一个ping操作的web界面 用户从web界面输入目标IP&#xff0c;提交后台会对改IP地…

【Java面试题】JVM(26道)

文章目录 JVM面试题基础1.什么是JVM&#xff1f;2.JVM的组织架构&#xff1f; 内存管理3.JVM的内存区域是什么&#xff1f;3.1堆3.2方法区3.3程序计数器3.4Java虚拟机栈3.5本地方法栈 4.堆和栈的区别是什么&#xff1f;5.JDK1.6、1.7、1.8内存区域的变化&#xff1f;6.内存泄露…

spring加载类初始化顺序

今天看spring官网的时候&#xff0c;提到了Ordered执行顺序。我当时记得PostConstruct注解会在bean加载后执行&#xff0c;现在又来了一个执行顺序&#xff0c;直接给我整蒙了。 于是我写了一个简单的dom来看看&#xff0c;它是什么&#xff1a; Service("t2ServerImpl&q…

【Redis】Redis的使用

登录redis [roottest2 ~]# redis-cli 127.0.0.1:6379> 或[roottest2 ~]# redis-cli -h 192.168.67.12 -p 6379 192.168.67.12:6379> redis-benchmark 测试工具 redis-benchmark 是官方自带的Redis性能测试工具&#xff0c;可以有效的测试Redis服务的性能 基本的测试语…

js正则给数值每三位加逗号

<template><div>{{ num.toFixed(2).replace(/\B(?(\d{3})(?!\d))/g, ",") }}</div> </template> <script> </script> <style> </style> 如上所示&#xff1a;保留两位小数后&#xff0c;用正则进行替换 效果&am…

Nacos Namespace 未授权访问漏洞

Nacos Namespace 未授权访问漏洞 问题 nacos 源码启动&#xff0c;发现即使开启了鉴权&#xff1a;nacos.core.auth.enabledtrue&#xff0c;未登录情况下&#xff0c;命名空间列表接口仍旧能查询到数据 鉴权逻辑 通过**AuthFilter **进行权限校验判断方法上是否存在注解 …

Matlab 基础语法 小结

input x input(prompt) # input digit str1 input(prompt,s) # input string执行图像处理任务 require Image Processing Toolbox Image Processing Toolbox™ provides a comprehensive set of reference-standard algorithms and workflow apps for image processing, a…

linux 内核版本

Linux 内核的版本命名遵循主版本号.次版本号.修订版本号的模式。其中&#xff0c;主版本号表示重大的变化或重写&#xff1b;次版本号如果是偶数&#xff0c;表示稳定版本&#xff0c;适合广泛使用&#xff0c;如果是奇数&#xff0c;表示开发版本&#xff0c;包含新的实验性功…

WinForm用微软打包工具打包

WinForm用微软打包工具打包 1. 安装扩展 下载扩展Microsoft Visual Studio Installer Projects 点击扩展 —> 管理扩展 安装完之后重启VS就好了。 2. 新建Set up项目 点击解决方案 —> 添加 —> 新建项目 选择这个Setup Project 创建打包项目 安装项目&…

就业班 第二阶段(python) 2401--4.3 day2 python2

七、标准数据类型 1、为什么编程语言中要有类型 类型有以下几个重要角色&#xff1a; 对机器而言&#xff0c;类型描述了内存中的电荷是怎么解释的。 对编译器或者解释器而言&#xff0c;类型可以协助确保上面那些电荷、字节在程序的运行中始终如一地被理解。 对程序员而言…

ACM ICPS独立出版 | 第三届智能无人系统与人工智能国际会议(SIUSAI 2024)

会议简介 Brief Introduction 2024年第三届智能无人系统与人工智能国际会议(SIUSAI 2024) 会议时间&#xff1a;2024年5月17日-19日 召开地点&#xff1a;中国青岛 大会官网&#xff1a;www.siusai.org 2024年第三届智能无人系统与人工智能国际会议(SIUSAI 2024)由青岛大学主办…

C语言 函数——函数的定义、调用和参数传递

目录 模块化编程&#xff08;Modular Programming&#xff09; 函数的分类 函数的定义 使用函数编程的好处 函数调用的基本方式 函数调用时的数据传递 函数调用的过程 main函数的特殊性 大话三国 分而治之 如果将main&#xff08;&#xff09;函数比作诸葛亮&#xff…