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

LeetCode 面试经典150题 137.只出现一次的数字II

题目

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

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

思路

方法一:暴力思路

方法二:

其中 & 运算相当于为异或运算添加了一个约束:当……为 1 时,才执行异或操作。

由于位运算具有「并行计算」的特点,上述运算规则可以推广到多个比特的情况。

最后,由于模 3 加法的结果要么是 0,要么是 1,没有 2,那么根据 b 的定义,这刚好就是 b,所以最后返回 b。

代码

class Solution {  // 方法一
    public int singleNumber(int[] nums) {
        int ans = 0;  // 返回结果
        for (int i = 0; i < 32; i++) {  // 统计32位每一位上1的个数
            int count = 0;  // 记录每一位上1的个数
            for (int num : nums) {
                count += num >> i & 1;  // 先右移然后再取最低位
            }
            ans |= count % 3 << i;  // 先模3再左移,不要忘了左移
        }
        return ans;
    }
}
class Solution {  // 方法二
    public int singleNumber(int[] nums) {
        int a = 0, b = 0;
        for (int x : nums) {
            int tmpA = a;
            a = (a ^ x) & (a | b);
            b = (b ^ x) & ~tmpA;
        }
        return b;
    }
}

性能

方法一 时间复杂度O(32n)  空间复杂度O(1)

方法二 时间复杂度O(n)  空间复杂度O(1)

知识点:

1、Java中运算符的优先级

++ -- ~  -> 算术运算符(+-*/) -> 关系运算符(> < >= <=)  ->  逻辑运算符(& | ^) -> 条件运算符(?:) ->赋值运算符

2、模2加法、模3加法


http://www.kler.cn/a/320095.html

相关文章:

  • 如何优化Elasticsearch大文档查询?
  • 从代码层面熟悉UniAD,开始学习了解端到端整体架构
  • WORD转PDF脚本文件
  • Java安全—SPEL表达式XXESSTI模板注入JDBCMyBatis注入
  • 论文阅读:Searching for Fast Demosaicking Algorithms
  • 第G1周:生成对抗网络(GAN)入门
  • 深入探索 RUM 与全链路追踪:优化数字体验的利器
  • Python有常用库学习整理(一)
  • ThreadPoolExecutor的原理?
  • 【大数据】元数据是解锁数据价值的关键
  • JPA+Thymeleaf增删改查
  • WPF 绑定 DataGrid 里面 Button点击事件 TextBlock 双击事件
  • 免杀笔记 ---> 无痕Hook?硬件断点 Syscall!
  • Git 的安装和配置
  • Ubuntu下TexMaker发生CTeX fontset `fandol‘ is unavailable问题
  • SpringSecurity-用户认证
  • JAVA基础语法 day07
  • 全能通人工智能的能力评估框架-Levels of AGI: Operationalizing Progress on the Path to AGI
  • 欺诈文本分类检测(十六):支持分类原因评测改造
  • 面经 | 手写
  • 口语笔记——被动语态
  • spring boot 项目中redis的使用,key=value值 如何用命令行来查询并设置值。
  • 001、restful设计规范
  • OpenHarmony(鸿蒙南向)——平台驱动开发【SDIO】
  • golang雪花算法实现64位的ID
  • JWT(JSON Web Tokens) 详细介绍