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

位运算(6)_只出现一次的数字 II

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

位运算(6)_只出现一次的数字 II

收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

温馨提示:

1. 题目链接 :

2. 题目描述 :

3. 解法(位运算) :

    算法思路 :

    代码展示 :

    结果分析 :


温馨提示:

本文的算法题需要一些位运算知识的基础,如果大家还不是很了解的话,可以先去看下面的博客:
位运算(1)_常见位运算总结-CSDN博客

1. 题目链接 :

OJ链接: 只出现一次的数字 II

2. 题目描述 :

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

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

(也就是时间复杂度为O(N),空间复杂度为O(1))

示例 1:

输入:nums = [2,2,3,2]
输出:3

示例 2:

输入:nums = [0,1,0,1,0,1,99]
输出:99

提示:

  • 1 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
  • nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

3. 解法(位运算) :

    算法思路 :

设要找的数位ret.

由于整个数组中,需要找的元素只出现了[一次],其余的数都出现了三次,因此我们可以根据所有数的[某一个比特位]的总和%3的结果,快速定位到ret的[一个比特位上]的值是0还是1.

这样我们通过ret的每一个比特位上的值,就可以将ret给还原出来.

    代码展示 :

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for(int i = 0; i < 32; i++)
        {
            int sum = 0;
            for(auto ch : nums)
                if(((ch >> i) & 1) == 1) sum++;
            if(sum % 3) ret |= 1 << i;
        }
        return ret;
    }
};

    整体思路:
    位操作 : 利用位操作和位的统计方法来解决问题。每个数字都是由 32 位组成,遍历每一位并统计所有数字在该位上为 1 的次数。

    模运算 : 通过 sum % 3 来确定在这个位上是否只出现了一次的数字。如果该位的 1 的出现次数不为 3,则该位的值应该在结果中保留。

 

 

    结果分析 :

时间复杂度:

外层循环遍历 32 位:O(32), 也就是 O(1)。
内层循环遍历数组 nums,假设数组的长度为 n,则内层的复杂度为 O(n)。
总的时间复杂度为 O(n)。
空间复杂度 :

只使用了常数级别的额外空间(ret, sum, 和循环变量),所以空间复杂度为 O(1)。


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

相关文章:

  • Node Version Manager (nvm) -管理不同版本的 Node.js
  • 【C++】模板与泛型编程(一):定义模板,控制实例化、效率与灵活性
  • Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定
  • Rust 在前端基建中的使用
  • Linux系统安装部署xtrabackup
  • java web springboot
  • Build a Large Language Model (From Scratch)学习汇总
  • uni-app运行到 Android 真机和Android studio模拟器
  • three.js 通过着色器实现热力图效果
  • 【项目开发】跨专业合作平台实战(附源码)
  • esp32开发环境搭建和烧录测试
  • 10.2学习
  • Sqoop面试整理
  • LeetCode[中等] 763. 划分字母区间
  • Leecode热题100-75.颜色分类
  • 【AndroidStudio】关于AndroidStudio的常见控件TextView和Button
  • Vue2(十三):路由
  • Java文件上传同时传入JSON参数
  • 软件工程的详细学习要点和学习方向
  • git commit -am 仅提交已修改文件
  • 怎么绕开华为纯净模式安装软件
  • 机器学习篇-day02-KNN算法实现鸢尾花模型和手写数字识别模型
  • Pikachu- SQL Inject - http header 头注入
  • 《Linux从小白到高手》理论篇(六):Linux软件安装一篇通
  • Leecode SQL 184. Department Highest Salary 找出tie
  • 基于STM32的数字温度传感器设计与实现