首页 > 其他分享 >剑指 Offer II 004. 只出现一次的数字 【模拟】【位数统计取余】

剑指 Offer II 004. 只出现一次的数字 【模拟】【位数统计取余】

时间:2022-09-19 10:23:19浏览次数:69  
标签:nums int res 复杂度 Offer II 004 取余 32

题目

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

难度:中等

提示:

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

进阶:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

题解

模拟

单纯模拟,使用Map存储次数,然后遍历找出只出现一次的元素

class Solution {
    public int singleNumber(int[] nums) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>(10);
        for (int i = 0; i < nums.length; i++) {
            map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
        }
        int res = 0;
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                res = entry.getKey();
                break;
            }
        }
        
        return res;
    }
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

位数统计取余(#)

int 类型固定为 32位。使用一个长度为 32 的数组 cnt[]cnt[] 记录下所有数值的每一位共出现了多少次 1,再对 cnt[]数组的每一位进行 mod 3操作,重新拼凑出只出现一次的数值。

mod取余,将多次出现的数都消除掉

class Solution {
    public int singleNumber(int[] nums) {
        int[] count = new int[32];
        int res = 0;
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < 32; j++) {
                if (((nums[i] >> j) & 1) == 1) {
                    count[j]++;
                }
            }
        }
        
        for (int i = 31; i >=0;i--) {
            count[i] = count[i] % 3;
            res = res << 1;
            if (count[i] == 1) {
                res = res | 1;
            }
        }
        return res;
    }
}

复杂度分析

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

标签:nums,int,res,复杂度,Offer,II,004,取余,32
From: https://www.cnblogs.com/tothk/p/16706811.html

相关文章

  • 剑指 Offer II 003. 前 n 个数字二进制中 1 的个数【模拟】
    题目给定一个非负整数n,请计算0到n之间的每个数字的二进制表示中1的个数,并输出一个数组。难度:简单说明:0<=n<=105题解按照题意模拟即可classSolutio......
  • 剑指 Offer II 002. 二进制加法【暴力】【模拟】
    题目给定两个01字符串a和b,请计算它们的和,并以二进制字符串的形式输出。输入为非空字符串且只包含数字1和0。难度:简单提示:1<=a.length,b.length<=104......
  • 学习笔记-涛讲F#(基础 II)
    目录处理一堆数组织代码(命名空间、模块)使用联合重命名类型类必须显式转换成接口对象表达式递归函数CPS解决堆栈溢出扩展一个类型静态解析的类型参数ref变量的实现原理及应......
  • SVN: E155004: THERE ARE UNFINISHED WORK ITEMS IN ''; RUN 'SVN CLEANUP' FIRST
    eclipse开发过程中,检出项目时报错执行项目右键-team-runcleanup-也还是会报这个错误;解决办法下载软件https://www.sqlite.org/download.html解压放到项目.svn目录......
  • 通过IIS部署Flask项目
      本文主要介绍在WindowsServer2012R2上通过IIS部署Flask项目的过程,以及对TTFB延迟大问题的思考。关于如何申请云服务器,注册(子)域名,备案,开放云服务器端口,获取SSL证书......
  • IIS 实现http重定向https(亲测有效:解决URL重写模块配置https重定向不生效的问题)
    前言以前部署网站的时候,都是通过代码来实现http重定向https,最近在部署个人网站的时候,突发奇想可不可通过IIS来实现无代码的重定向呢?在一番操作猛如虎的搜索引擎操作后,发......
  • 剑指 Offer 05. 替换空格
    题目剑指Offer05.替换空格请实现一个函数,把字符串s中的每个空格替换成"%20"。示例1:输入:s="Wearehappy."输出:"We%20are%20happy."思路双指针,类似于27.移......
  • C#、IIS获取时间带星期或日期问题解决
    cmd   regedit打开注册表,进入到[HKEY_USERS\.DEFAULT\Control Panel\International]  ,然后1、将键 sDate 的值由 / 改为 - 2、将键 sShortDate 的值由 yyyy......
  • Meeting Rooms III
    MeetingRoomsIIIYouaregivenaninteger$n$.Thereare$n$roomsnumberedfrom$0$to$n-1$.Youaregivena2Dintegerarray meetings where meetings[i......
  • 剑指Offer 30.包含min的栈
    定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数在该栈中,调用min、push及pop的时间复杂度都是O(1)。 示例:MinStackminStack=newMinSt......