力扣刷题Days15第二题-137. 只出现一次的数字 II(js)

目录

1,题目

2,代码

2.1哈希表

2.2 依次确定每一个二进制位

3,学习与总结

1. 左移运算符 (<<)

2. 有符号右移运算符 (>>)

3. 无符号右移运算符 (>>>)


1,题目

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

2,代码

2.1哈希表

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    // 哈希表
    const hashtable = new Map();
    for(let num of nums){
        hashtable.set(num,(hashtable.has(num)|| 0) + 1);
    }
    for(let [key,value] of hashtable){
        if(value===1){
            return key;
        }
    }

};

下次注意使用迭代器

for( const [num, occ] of freq.entries() )

2.2 依次确定每一个二进制位

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    // 依次确定每一个二进制位
    let ans = 0;
    for(let i=0;i<32;i++){
        let total =0;
        for(let num of nums){
            total += (num >> i) & 1;
        }
        if(total%3 != 0){
            ans |= (1 << i);
        }

    }
    return ans;
    
};
((num >> i) & 1)

num 的第 i 位移动到最低位,检查这一位是否为 1

ans |= (1 << i) 

ans |= (1 << i) 的作用是将 ans 的第 i 位设置为 1。这是通过创建一个只在第 i 位为 1 的数字(即 1 << i),然后将其与 ans 进行按位或操作来实现的。如果 ans 在第 i 位原本就是 1,这个操作保持该位为 1;如果 ans 在第 i 位是 0,这个操作将其修改为 1

假设 ans 当前的值是 2(二进制 0010),我们要将第 2 位(从右向左数,从 0 开始计数)设置为 1

  • 1 << 2 生成了一个在第 2 位为 1 的数字,即 0100(二进制)或 4(十进制)。
  • 接着,ans |= (1 << 2) 相当于 0010 | 0100,结果是 0110(二进制),即 6(十进制)。
for (let i = 0; i < 32; ++i) { ... }:外层循环遍历从 0 到 31 的整数 i,代表要检查的二进制位的位置。这是因为 JavaScript 中的数字是以 32 位整数形式存储的。

3,学习与总结

JavaScript 中有几种位移运算符

1. 左移运算符 (<<)

  • 语法x << n
  • 作用:将 x 的二进制表示向左移动 n 位,右边空出的位用 0 填充。
  • 示例4 << 1 的结果是 8,因为 4 的二进制是 100,向左移一位变成 1000,即 8

2. 有符号右移运算符 (>>)

  • 语法x >> n
  • 作用:将 x 的二进制表示向右移动 n 位,保持符号位不变(即正数左边填充 0,负数填充 1)。
  • 示例-8 >> 2 的结果是 -2-8 的二进制表示(假设是 8 位)是 11111000,向右移两位,填充最左边的符号位(1),得到 11111110,即 -2

3. 无符号右移运算符 (>>>)

  • 语法x >>> n
  • 作用:将 x 的二进制表示向右移动 n 位,左边空出的位用 0 填充,不考虑符号位。
  • 示例-8 >>> 2 的结果取决于你的 JavaScript 引擎如何处理 32 位整数,但它会将 -8 视为一个很大的正数(因为二进制的最高位被视为值位而不是符号位)。

使用场景和注意事项:

  • 性能优化:位移运算符通常用于性能敏感的低层代码,例如图形计算、加密算法等,因为它们直接操作二进制位,运行速度快。
  • 逻辑操作:位移运算可以用来执行乘法或除法操作(例如,左移一位相当于乘以 2,右移一位相当于除以 2),但要注意符号和数值范围。
  • 无符号右移:在处理无符号数或将负数以无符号的形式解释时特别有用。
  • 类型转换:位移运算符会将操作数转换为 32 位整数,这可能会导致意外的行为,尤其是在使用无符号右移时。

示例

假设 num = 5(二进制为 0101)和 i = 2,我们来看这行代码如何工作:

  • 首先,num >> i5 >> 2,意味着将 5 的二进制表示向右移动两位,得到 0001
  • 接着,(num >> i) & 10001 & 0001,结果为 1,因为最低位是 1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

不要在代码中随便使用try...catch了

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 背景 js中的try...catch try...catch运行机制 js的事件循环机制 try...c…

PMP没过能考下一次吗?PMP·考试不过下次费用多少?

每年都有许多人参加PMP考试&#xff0c;然而&#xff0c;并不是每个人都能一次性通过PMP考试&#xff0c;许多人可能会面临失败。带你了解PMP补考费用以及补考流程 01PMP补考费用是多少 考生若未能成功通过考试&#xff0c;还可以在一年PMI有效期内提交补考申请&#xff0c;若…

【文件增量备份系统】使用Mysql的流式查询优化数据清理性能(针对百万量级数据)

文章目录 功能介绍原始方案测试 流式处理测试 功能可用性测试 功能介绍 清理功能的作用是&#xff1a;扫描数据库中已经备份过的文件&#xff0c;查看数据源中是否还有相应的文件&#xff0c;如果没有&#xff0c;说明该文件被删除了&#xff0c;那相应的&#xff0c;也需要将…

多线程多进程

秋招面试的java八股文知识点补充以及iot 这里有一点阅读补充 线程和进程区别 什么是进程? 进程 (Process) 是计算机中的一个独立执行单元&#xff0c;是操作系统资源分配的基本单位。每个进程有各自独立的内存空间和资源&#xff0c;它们之间相互独立&#xff0c;相互之间…

长期异地就医备案有效期是多久?答记者问!

4、长期异地就医登记的有效期是多长&#xff1f; 答&#xff1a;异地长期就医登记长期有效。 如果您因个人原因需要变更长期居住地&#xff0c;只需提供相应的登记信息即可申请变更。 5、临时异地就医登记的有效期是多长时间&#xff1f; 答&#xff1a;临时异地就医登记包括…

ORACLE RAC数据库压力测试(swingbench)

------------------------------------------------------------------- 欢迎关注作者 墨天伦:潇湘秦的个人主页 - 墨天轮 CSDN:潇湘秦-CSDN博客 公众号:潇湘秦的DBA之路 ------------------------------------------------------------------- 为了验证跑在虚拟机上的or…

【C++庖丁解牛】模拟实现STL的string容器(最后附源码)

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.vs和g下string结构…

电机应用-步进电机进阶驱动

步进电机梯形加减速 什么是梯形加减速 假设该装置使用步进电机实现物体X的移动&#xff0c;系统要求从A点出发&#xff0c;到B点停止&#xff0c;移动的时间越短越好且系统稳定。 根据步进电机的特性&#xff0c;最大程度加大电机转速&#xff08;提高脉冲频率&#xff09;&a…

【脚本玩漆黑的魅影】全自动对战宫殿

文章目录 原理主要代码全部代码 原理 对战宫殿是让宠物自己打&#xff0c;不需要我们选技能&#xff0c;所以用来刷对战点数很合适。 需要准备三个主力。 主要是根据屏幕截图进行各种操作。 1&#xff0c;外面的对话&#xff0c;除了选自由级以外&#xff0c;其他都是直接点…

第十一个实验:数组和簇的混用,线性

实验内容: 输入5个元素的一维数组 显示每一个元素的值,索引和奇偶类型 第一步:新建项目 第二步:编程 创建一维数组,一共五个元素 ​​​ 选择数组索引部件 判断元素的奇偶性,把元素值,该元素索引和奇偶特性组成簇 复制4份,每一个元素一份

(day 2)JavaScript学习笔记(基础之变量、常量和注释)

概述 这是我的学习笔记&#xff0c;记录了JavaScript的学习过程&#xff0c;我是有一些Python基础的&#xff0c;因此在学习的过程中不自觉的把JavaScript的代码跟Python代码做对比&#xff0c;以便加深印象。我本人学习软件开发纯属个人兴趣&#xff0c;大学所学的专业也非软件…

MySQL技能树学习

MySQL三大范式&#xff1a; 第一范式主要是确保数据表中每个字段的值必须具有原子性&#xff0c;也就是说数据表中每个字段的值为不可再次拆分的最小数据单元。 第二范式是指在第一范式的基础上&#xff0c;确保数据表中除了主键之外的每个字段都必须依赖主键。 第三范式是在…

【设计模式】享元模式的使用场景及与其他共享技术的对比

文章目录 1.概述2.享元模式2.1.核心概念2.2.实现案例2.2.1.内部状态实现2.2.2.外部状态实现 2.3.更多场景 3.享元模式的一些对比3.1.与缓存的区别3.2.与池化技术的区别 4.总结 1.概述 享元模式&#xff08;Flyweight Pattern&#xff09;是一种非常常用的结构型设计模式&#…

实在TARS大模型斩获多项重磅大奖,AI领域实力认可

近日&#xff0c;实在智能TARS&#xff08;塔斯&#xff09;大模型凭借在多个垂直行业场景的优秀落地应用案例&#xff0c;以及AIGC领域的深耕和技术积累&#xff0c;荣获多项重磅大奖。 TARS大模型是是实在智能基于在自然语言处理&#xff08;NLP&#xff09;领域深厚的技术积…

MySQL常见的索引类型介绍

我将为您详细讲解 MySQL 中常见的索引类型&#xff0c;以及它们的使用场景、特点、区别和优势。索引是提高数据库查询性能的关键工具&#xff0c;它可以加速数据检索速度&#xff0c;减少服务器的负担。在 MySQL 中&#xff0c;索引类型主要包括 B-Tree 索引、哈希索引、全文索…

Linux进程概念僵尸进程孤儿进程

文章目录 一、什么是进程二、进程的状态三、Linux是如何做的&#xff1f;3.1 R状态3.2 S状态3.3 D状态3.4 T状态3.5 t状态3.6 X状态3.7 Z状态 四、僵尸进程4.1 僵尸进程危害 五、孤儿进程 一、什么是进程 对于进程理解来说&#xff0c;在Windows上是也可以观察到的&#xff0c…

Java线程的6种状态

线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。 NEW&#xff1a;初始状态&#xff0c;线程被创建出来但没有被调用start()RUNNABLE&#xff1a;运行状态&#xff0c;线程被调用了start()等待运行的状态BLOCKED&#xff1a;阻塞状态&#xf…

新手如何快速上手学习单片机?

读者朋友能容我&#xff0c;不使博文负真心 新开专栏&#xff0c;期待与诸君共享精彩 个人主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《单片机》 学习单片机是一个有趣且有挑战性的过程。单片机是一种微控制器&#xff0c;广泛应用于各种电子设备和嵌入式系统中。在这…

开源向量数据库介绍

在开源矢量数据库的世界里&#xff0c;有些名字因其性能、灵活性和健壮性而脱颖而出。 1. Milvus Milvus 由 Zilliz 推出&#xff0c;是一款高度可定制的开源矢量数据库&#xff0c;在处理大规模数据方面大放异彩。由于其出色的可扩展性&#xff0c;当你需要处理大量数据时&a…

Python对头发二维建模(考虑风力、重力)

目录 一、背景 二、代码 一、背景 数值方法被用于创建电影、游戏或其他媒体中的计算机图形。例如&#xff0c;生成“逼真”的烟雾、水或爆炸等动画。本文内容是对头发的模拟&#xff0c;要求考虑重力、风力的影响。 假设&#xff1a; 1、人的头部是一个半径为10厘米的球体。…