【每日一题Day348】LC137只出现一次的数字Ⅱ | 状态转移

news/2025/3/5 12:24:44/

只出现一次的数字Ⅱ【LC137】

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

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

排序

将数组从小到大排序,返回与下下一个元素不相等的元素

  • 代码

    class Solution {public int singleNumber(int[] nums) {Arrays.sort(nums);int i = 0;while ( i < nums.length - 1 ){if (nums[i] == nums[i+2]){i = i + 3;}else{return nums[i];}}return nums[i];}
    }
    
  • 复杂度

    • 时间复杂度:O(nlogn)

    • 空间复杂度:O(1)

考虑各二进制位

考虑数字的二进制形式,对于出现三次的数字,各二进制位出现的次数都是 3 的倍数。 因此,统计所有数字的各二进制位中 1的出现次数,并对 3求余,结果则为只出现一次的数字。

遍历统计
  • 代码

    class Solution {public int singleNumber(int[] nums) {int[] counts = new int[32];for(int num : nums) {for(int j = 0; j < 32; j++) {counts[j] += num & 1; // 更新第 j 位num >>>= 1; // 第 j 位 --> 第 j + 1 位}}int res = 0, m = 3;for(int i = 0; i < 32; i++) {res <<= 1;// 左移 1 位res |= counts[31 - i] % m;// 恢复第 i 位的值到 res}return res;}
    }作者:Krahets
    链接:https://leetcode.cn/problems/single-number-ii/solutions/8944/single-number-ii-mo-ni-san-jin-zhi-fa-by-jin407891/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 复杂度
      • 时间复杂度: O ( n C ) O(nC) O(nC)

      • 空间复杂度: O ( C ) O(C) O(C)

  • 实现

    每计算一位就统计该位的结果

    class Solution {public int singleNumber(int[] nums) {int ans = 0;for (int i = 0; i < 32; ++i) {int total = 0;for (int num: nums) {total += ((num >> i) & 1);}if (total % 3 != 0) {ans |= (1 << i);}}return ans;}
    }作者:力扣官方题解
    链接:https://leetcode.cn/problems/single-number-ii/solutions/746993/zhi-chu-xian-yi-ci-de-shu-zi-ii-by-leetc-23t6/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 复杂度
      • 时间复杂度: O ( n C ) O(nC) O(nC)

      • 空间复杂度: O ( C ) O(C) O(C)

数字电路设计:有限状态机
  • 优化思路:同时处理某个数的所有二进制位

    • 每一位的值对3取余后的结果可能是0、1、2三种,因此我们需要两个整数来进行存储,即为a、b

    • 每遍历一个数字,根据 x i x_i xi的值, a i a_i ai b i b_i bi会改变,列出状态转移表

      image-20231015095347112
    • 由转态转移表,可以得出a和b的状态转移方程
      a i = a i ′ b i x i + a i b i ′ x i ′ b i = a i ′ b i ′ x i + a i ′ b i x i ′ = a i ′ ( b i ⊕ x i ) a_i=a_i'b_ix_i+a_ib_i'x_i'\\ b_i=a_i'b_i'x_i+a_i'b_ixi'=a_i'(b_i \oplus x_i) ai=aibixi+aibixibi=aibixi+aibixi=ai(bixi)

  • 实现

    class Solution {public int singleNumber(int[] nums) {int a = 0, b = 0;for (int num : nums) {int aNext = (~a & b & num) | (a & ~b & ~num), bNext = ~a & (b ^ num);a = aNext;b = bNext;}return b;}
    }作者:力扣官方题解
    链接:https://leetcode.cn/problems/single-number-ii/solutions/746993/zhi-chu-xian-yi-ci-de-shu-zi-ii-by-leetc-23t6/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 复杂度
      • 时间复杂度: O ( n ) O(n) O(n)

      • 空间复杂度: O ( 1 ) O(1) O(1)

举一反三

  • 题目:输入一个整数数组,数组中只有一个数宇出现m次,其他数字都出现n次。请找出那个唯一出现m次的数宇。假设m不能被 n整除。
  • 分析:如果数组中所有数字的第i个数位相加之和能被n整除,那么出现m 次的数宇的第个数位一定是0;否则出现m次的数字的第i个数位一定是1

http://www.ppmy.cn/news/1154513.html

相关文章

ios UI 基础开发一

目录 第一节&#xff1a;基础库 第二节&#xff1a;弹出模拟器的键盘 第三节&#xff1a;模拟器回到桌面 第四节&#xff1a;Viewcontroller 与 View 的关系 第五节&#xff1a;快捷键 第六节&#xff1a;键盘召回 ​第七节&#xff1a;启动流程xcode介绍 第八节&#xf…

C#中LinkedList、Queue<T>和Stack<T>的使用

1、LinkedList(链表) 链表中元素存储内存中是不连续分配&#xff0c;每个元素都有记录前后节点&#xff0c;节点值可以重复&#xff0c;不能通过下标访问&#xff0c;泛型的使用保证类型安全&#xff0c;可以避免装箱拆箱&#xff0c;找元素就只能遍历&#xff0c;查找不方便&…

Sigma中的数字增益放大/降低方法

1 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;加他微信hezkz17, 本群提供音频技术答疑服务

【Python、Qt】使用QItemDelegate实现单元格的富文本显示+复选框功能

主打一个 折磨 坑多 陪伴。代码为Python&#xff0c;C的就自己逐条语句慢慢改吧。 Python代码&#xff1a; import sys from types import MethodType from PyQt5.QtCore import Qt,QPoint,QSize,QRect,QEvent from PyQt5.QtGui import QStandardItemModel, QStandardItem,QTe…

RT-Thread v5.0.2 发布

RT-Thread 代码仓库地址&#xff1a; ● https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本发布日志详情&#xff1a; ● https://github.com/RT-Thread/rt-thread/releases/tag/v5.0.2 RT-Thread 迎来了全新的版本 v5.0.2&#xff0c;自 v5.0.0 版本发布以来&am…

音视频开发岗位,2023年为何持续增加?如何应聘音视频岗位

随着基础设施的完善&#xff08;光纤入户、wifi覆盖、5G普及&#xff09;&#xff0c;加之2020年疫情的影响&#xff0c;将短视频、直播、视频会议、在线教育、在线医疗瞬间推到了顶峰&#xff0c;人们对音视频的需求和要求也越来越强烈。音视频开发是指利用计算机技术和相关编…

python写着玩

摄氏温度转化为华氏温度 #摄氏温度转化为华氏温度 celsius float(input("请输入摄氏度&#xff1a;")) fahrenheit(9/5)*celsius32 print("华氏温度是%.1f"%fahrenheit) 计算圆柱体的体积 #计算圆柱体的体积 radius , length map( float,input("请…

can not remove .unionfs

文件夹下出现unionfs 套娃&#xff0c;无法删除。 处理方式&#xff1a; 需要管理员权限umount之后删除使用fusermount -zu .unionfs &#xff0c;然后再删除。