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

news2024/11/28 10:47:49

题目

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 为 0
        int ones=0, twos=0;
        // 对于 actions 中的每一个元素 ele
        for(auto &ele:actions){
            // 计算 ones 的状态转移
            ones = ones ^ ele & ~twos;  // 根据当前的 ele 更新 ones 的状态
            // 计算 twos 的状态转移
            twos = twos ^ ele & ~ones;  // 根据当前的 ele 更新 twos 的状态
        }
        // 返回最终计算得到的 ones,它记录了“只出现一次的数字”的情况
        return ones;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

帝国CMS模板源码整站安装说明(图文)

安装步骤 第一步&#xff1a;先把得到的文件解压缩&#xff0c;把文件通过FTP传到空间里。&#xff08;请不要把类似www.lengleng.net这个文件夹传到FTP&#xff0c;请传这个大文件夹下面的所有文件夹和文件到空间根目录&#xff0c;请不要上传到2级目录&#xff0c;除非你自己…

kimi开放API使用了,来看如何使用

更多精彩内容在公众号。 kimi现在算是国内火得不行的AI工具。最近使用人太多&#xff0c;都经常出现响应不过来的情况。借助这波热潮&#xff0c;kimi顺势推出了API使用。 来看kimi的官方介绍使用。https://platform.moonshot.cn 文本生成模型 Moonshot的文本生成模型&#…

外包干了6天,技术明显进步

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…

PWM 脉宽跟随方案介绍

1. 前言 数字电源产品在使用桥式电路拓扑或是多路交错控制中&#xff0c;有时会需要滞后臂的 PWM 脉宽严格跟随超前臂的 PWM 脉宽&#xff0c;或从路的 PWM 脉宽严格跟随主路的 PWM 脉宽&#xff0c;本文将介绍如何利用高精度定时器实现 PWM 输出脉宽跟随&#xff0c;一种使用…

设计模式浅析(十一) ·状态模式

设计模式浅析(十一) 状态模式 日常叨逼叨 java设计模式浅析&#xff0c;如果觉得对你有帮助&#xff0c;记得一键三连&#xff0c;谢谢各位观众老爷&#x1f601;&#x1f601; 状态模式 概念 状态模式 Java中的状态模式&#xff08;State Pattern&#xff09;是一种行为型…

Web漏洞-文件上传常见验证

后缀名&#xff1a;类型&#xff0c;文件头等 后缀名&#xff1a;黑白名单 文件类型&#xff1a;MIME信息 文件头&#xff1a;内容头信息 常见黑名单&#xff08;明确不允许上传的格式后缀&#xff09;&#xff1a;asp、php、jsp、aspx、cgi、war &#xff08;如果没有完整…

绿联 安装Frpc内网穿透并使用Nginx反向代理

绿联 安装Frpc内网穿透并使用Nginx反向代理 1、前言 服务器官网&#xff1a;雨云 - 新一代云服务提供商 本教程使用Frps与Frpc进行内网穿透&#xff0c;其中Frps需要自购服务器安装&#xff0c;若无法购买服务器则本教程对你无用&#xff1b; 另外还需拥有自己的域名&#xf…

什么是数据库?如何安装SQL Server(超详细版)

文章目录 什么是数据库数据库与数据库管理系统数据库系统之间的区别和联系数据库在生活中的应用 安装SQL Server数据库系统要求 安装步骤(超详细)安装前的准备 安装SSMS 什么是数据库 数据库&#xff0c;顾名思义&#xff0c;是存储数据的“仓库”。它不仅仅是简单的数据存储&…

软件验收流程

验收环节&#xff0c;甲方需要做哪些事情&#xff1f;这些事情的流程是什么&#xff1f;做这些事情能给甲方带来什么好处&#xff1f; 软件验收阶段&#xff0c;甲方要做的事情&#xff1a; 验收环节介绍 1. 开始 目的&#xff1a;启动验收流程&#xff0c;为后续工作做好准…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-航班时间

#include<iostream> using namespace std;int getTime(){int h1, h2, m1, m2, s1, s2, d 0;//d一定初始化为0&#xff0c;以正确处理不跨天的情况 scanf("%d:%d:%d %d:%d:%d (%d)", &h1, &m1, &s1, &h2, &m2, &s2, &d);return d …

【随笔】Git 高级篇 -- 相对引用2 HEAD~n(十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

matlab使用教程(37)—求解数值积分(2)

1多项式积分的解析解 本示例显示如何使用 polyint 函数对多项式求解析积分。使用此函数来计算多项式的不定积分。 1.1定义问题 考虑实数不定积分&#xff0c; 其中 k 是积分常量。由于没有指定积分限值&#xff0c; integral 函数族不太适合求解这个问题。 1.2用向量表示多…

量子计算领域迎来了一项令人振奋的突破。

近日&#xff0c;量子计算领域迎来了一项令人振奋的突破。Quantinuum公司与科技巨头Microsoft宣布&#xff0c;双方在容错量子计算方面取得了显著成果。这一成就原本预计需要数年时间才能实现&#xff0c;但两家公司的紧密合作使得这一目标提前达成。 Quantinuum的新一代量子计…

js笔记(学习存档)

JS的调用方式与执行顺序 使用方式 HTML页面中的任意位置加上<script type"module"></script>标签即可。 常见使用方式有以下几种&#xff1a; 直接在<script type"module"></script>标签内写JS代码。直接引入文件&#xff1a;…

2024-4-7 QT day1作业

myWidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口标题this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(QIcon("C:\\Users\\张谦\\Desktop\\pictrue\\qq.png"));//设…

V R沉浸式体验的应用|R主题馆加盟|V R游戏体验馆加盟

《探索未知世界&#xff0c;沉浸式VR体验引领未来》 随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正逐渐走进人们的生活&#xff0c;并为我们带来前所未有的沉浸式体验。下面让我们一起探索一下&#xff0c;VR沉浸式体验的应用领域和魅力所在。 虚…

安卓开机启动流程

目录 一、整体框架二、流程代码分析2.1 Boot ROM2.2 Boot Loader2.3 Kernel层Kernel代码部分 2.4 Init进程Init进程代码部分 2.5 zygote进程zygote代码部分 2.6 SystemServer进程SystemServer代码部分 2.7 启动Launcher与SystemUI 三、SystemServices3.1 引导服务3.2 核心服务3…

15个最流行的STL模型修复工具

如果你进行 3D 打印&#xff0c;可能遇到过可怕的“无法打印 STL”问题&#xff1a;你的 STL 文件看起来很棒&#xff0c;但它会导致切片机出现问题或导致奇怪的打印错误或完全失败。 无论确切原因是什么&#xff0c;这些问题的根源通常归结为 STL 用于表示 3D 模型的连接三角形…

day 74 js

JS的作用&#xff1a; 修饰 HTML 标签&#xff08;CSS&#xff09;设置 HTML 标签的动作&#xff08;JS&#xff09;JS特点&#xff1a;基于对象的编程语言&#xff0c;通过浏览器解释执行作用&#xff1a;表单验证、改变标签样式、获取和设置标签属性值 1 表单验证: <fo…

Java常用API_正则表达式_字符串的替换和截取方法——小练习

我将通过一个练习题来展示这两个方法 练习题&#xff1a; 有一段字符串&#xff1a;小张qwertyuiop123小李asdfghjkl456小王 要求1&#xff1a;把字符串中三个姓名之间的字母替换成vs 要求2&#xff1a;把字符串中的三个姓名切割出来 编写代码&#xff1a; public class Tes…