剑指 Offer !!56 - II. 数组中数字出现的次数 II

news2024/9/23 17:25:06
剑指 Offer 56 - II. 数组中数字出现的次数 II
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

 

示例 1:

输入:nums = [3,4,3,3]
输出:4
示例 2:

输入:nums = [9,1,7,9,7,9,7]
输出:1

在这里插入图片描述

通用版:
假设数组中,只有一个数出现1次,其余数都出现k次。问:这个“出现一次”的数是谁?

思路:
首先,将数组中每一位数转成二进制,
然后,对每一个二进制位做加法,第i位二进制记录到counts[i]中;
接着,counts[i]对k取余数,即counts[i]%k,(思考一下,此时那些出现k次的数的二进制表示的第i位,加和到counts[i]中,经过这次%k,他们的痕迹必然消失,所以此后count[i]就是那个“只出现一次”的数的二进制表示的第i位);
最后,将counts这个二进制数组 转换成对应十进制数即可。

下面是我参考了力扣K神之后自己写的代码,还有K神的代码:
区别在于:counts[i]的定义不同。

class Solution {
// 我自己写的,count[0]表示高位,count[31]表示低位
    public int singleNumber1(int[] nums) {
        int[] count = new int[32];
        for(int num:nums){
            for(int j=31;j>=0;j--){
                count[j] += (num&1);
                num>>>=1;
            }
        }
        
        int res=0;
        for(int j=0;j<32;j++){
            res=2*res+(count[j]%3); //注意这里是二进制转十进制
        }
        return res;
    }



     public int singleNumber(int[] nums) {
     // 大佬写的,count[31]表示高位,count[0]表示低位
         int[] counts = new int[32];
         for(int num:nums){
             for(int j=0;j<32;j++){
                 counts[j] += (num&1);
                 num>>>=1;
             }
         }
         int res=0;
         for(int i=0;i<32;i++){   
         // 注意这两句话不要写反了,可以想想:i=31时,res应该记录最低位;而如果写反了,res记录完counts[0],还会左移一位,此时最低位是0,这显然不对。          
             res<<=1;
             res|=(counts[31-i]%3);
             
         }
         return res;
     }
}

下面是《程序员代码面试指南》中解法
思路和上面相差不大,这里是把数组中每一个数转成k进制,每一位加和得到eo,
然后,对k取余数(注意考虑到“先求和再取余,等于,先取余再求和”,代码中这部分是一边求和一边取余),这一步之后那些“出现k次”的数在eo中必然没有留下痕迹,也就是说eo是我们要找那个“只出现一次”的数的k进制表示;
所以,将eo的k进制表示转化为十进制,即为最终结果。

  public int singleNumber(int[] nums) {
         return onceNum(nums,3);
     }
     public int onceNum(int[] nums, int k){
         int[] eo = new int[32];
         for(int i=0;i!=nums.length;i++){
             setExclusiveOr(eo,nums[i],k);
         }
         return getNumFromKSysNum(eo,k);
     }
     public void setExclusiveOr(int[] eo, int value, int k){
         int[] valueK = getKSysNumFromNum(value,k);
         for(int i=0;i<eo.length;i++){
             eo[i]=((eo[i]+valueK[i])%k); //先求和再取余,等于,先取余再求和
         }
     }
     public int[] getKSysNumFromNum(int num,int k){
         int[] res = new int[32];
         for(int i=0;i<32;i++){
             res[i]=(num%k); // 0位是最低位
             num/=k;
         }
         return res;
     }
     public int getNumFromKSysNum(int[] num,int k){
         int res=0;
         for(int i=0;i<32;i++){
             res = k*res+num[31-i];

         }
         return res;
     }

注:中间转成k进制的函数也可以写成下面的形式

 public int[] getKSysNumFromNum(int num,int k){
         int[] res = new int[32];
         int i=0;
         while(num!=0){
             res[i++]=(num%k); // 0位是最低位
             num/=k;
         }
         return res;
     }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧停车场:城市出行新潮流,轻松驶入未来

在如今城市日益拥堵的交通环境下&#xff0c;停车难题成为人们日常生活中的一大困扰。然而&#xff0c;随着科技的不断进步&#xff0c;智慧停车场的建设正为我们带来更为便捷、高效的出行体验&#xff0c;成为现代城市发展的重要一环。 智慧停车场利用先进的技术手段&#xff…

Nginx安装以及LVS-DR集群搭建

Nginx安装 1.环境准备 yum insatall -y make gcc gcc-c pcre-devel #pcre-devel -- pcre库 #安装openssl-devel yum install -y openssl-devel 2.tar安装包 3.解压软件包并创建软连接 tar -xf nginx-1.22.0.tar.gz -C /usr/local/ ln -s /usr/local/nginx-1.22.0/ /usr/local…

windows 安装免费3用户ccproxy ubuntu 代理上网

Windows 上进行安装 ubuntu 上进行设置 方法一 (临时的手段) 如果仅仅是暂时需要通过http代理使用apt-get&#xff0c;您可以使用这种方式。 在使用apt-get之前&#xff0c;在终端中输入以下命令&#xff08;根据您的实际情况替换yourproxyaddress和proxyport&#xff09;。 终…

水果音乐制作软件fl studio汉化中文修改版下载,FL Studio哪个版本更合适新手

水果音乐制作软件fl studio汉化中文修改版下载由兔八哥爱分享小编精心为大家整理了fl studio软件所有版本合集。水果音乐制作软件fl studio汉化中文修改版下载其中包含了fl studio、以及fl studio汉化补丁、fl studio修改程序、fl studio注册机等等&#xff0c;fl studio是一款…

【某SH公E司IN 数据挖掘工程师-提前批笔试2023-8-8】

题目&#xff08;回忆版&#xff09;&#xff1a; 给一棵树&#xff0c;每个节点要么是白色要么是红色&#xff0c;并且有节点编号&#xff0c;要求查询每个节点所在子树中红色节点的数量。 先是一个正整数 n&#xff0c;表示树有 n 个节点。 第二行给出 n-1 个数字&#xff0…

标准的OSI七层模型(其实了解tcp足矣)

七层模型&#xff0c;亦称OSI&#xff08;Open System Interconnection&#xff09;。参考模型是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联的标准体系&#xff0c;一般称为OSI参考模型或七层模型。 它是一个七层的、抽象的模型体&#x…

Mermaid语法使用

Mermaid语法使用 1. 基础类1.1 流程图1.2 时序图 2. 工程图2.1 类图2.2 Git图 1. 基础类 1.1 流程图 graph TBid1(圆角矩形)--普通线-->id2[矩形];subgraph 子图id2粗线>id3{菱形}id3-. 虚线.->id4>右向旗帜]id3--无箭头---id5((圆形))end方向定义 用词含义TB从…

Spring(13) IOC的工作流程

目录 一、定义二、Bean的声明方式三、IOC的工作流程 一、定义 IOC&#xff1a;全称是 Inversion Of Control&#xff0c;也就是控制反转&#xff0c;它的核心思想是把对象的管理权限交给容器。应用程序如果需要使用某个对象的实例&#xff0c;那么直接从 IOC 容器里面去获取就…

Win10无法投影关闭3D模式

Win10不小心开启了3D模式&#xff0c;插上投影仪就一闪一闪的&#xff0c;无法正投影 解决办法&#xff1a; 1. 打开注册表工具regedit&#xff0c;删除以下注册表&#xff0c;重启电脑 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configurat…

PAT(Advanced Level) Practice(with python)——1023 Have Fun with Numbers

Code N int(input()) D_N 2*N # print(Yes)if len(str(D_N))>len(str(N)):print(No) else:for s in str(D_N):if s not in str(N) or str(D_N).count(s)!str(N).count(s):print("No")breakelse:print(Yes) print(D_N)

R语言5_安装Giotto

环境Ubuntu22/20, R4.1. 已开启科学上网。 第一步&#xff0c;更新服务器环境&#xff0c;进入终端&#xff0c;键入如下命令&#xff0c; apt-get update apt install libcurl4-openssl-dev libssl-dev libxml2-dev libcairo2-dev libgtk-3-dev libhdf5-dev libmagick9-dev …

第一百二十五天学习记录:C++提高:STL-deque容器(下)(黑马教学视频)

deque插入和删除 功能描述&#xff1a; 向deque容器中插入和删除数据 函数原型&#xff1a; 两端插入操作&#xff1a; push_back(elem); //在容器尾部添加一个数据 push_front(elem); //在容器头部插入一个数据 pop_back(); //删除容器最后一个数据 pop_front(); //删除容器…

flutter开发实战-TextPainter计算文本内容的宽度

flutter开发实战-TextPainter计算文本内容的宽度 最近开发过程中根据Text文本的大小判断是否需要进行显示跑马灯效果&#xff0c;获取文本的大小&#xff0c;需要TextPainter来获取Size 一、TextPainter TextPainter主要用于实现文本的绘制。TextPainter类可以将TextSpan渲染…

【从零开始学习JAVA | 第四十四篇】TCP协议中的握手与挥手

前言&#xff1a; TCP&#xff08;传输控制协议&#xff09;作为计算机网络中的重要协议&#xff0c;扮演着确保数据可靠传输的角色。在TCP的通信过程中&#xff0c;握手与挥手问题是不可忽视的关键环节。握手是指在建立连接时&#xff0c;客户端与服务器相互确认彼此的身份并…

Json简述(C++)

目录 1.介绍 2.格式 3.底层 3.1数据对象表示 3.2序列化接口 3.3反序列化接口 4.使用 1.介绍 Json&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;其最早是为JavaScript编程语言设计的格式。不过发发展至今&#xff0c;Jso…

[RoarCTF 2019Online Proxy]sql巧妙盲注

文章目录 [RoarCTF 2019Online Proxy]sql巧妙盲注解题脚本脚本解析 [RoarCTF 2019Online Proxy]sql巧妙盲注 解题 在源代码界面发现&#xff1a;Current Ip 我们会联想到&#xff1a;X-Forwarded-For来修改ip&#xff1a; 结果我们发现&#xff0c;response会讲Last Ip回显出…

基于协同过滤的电影推荐

基于协同过滤的推荐算法综述 - 知乎 (zhihu.com) # -*- coding: gbk -*- import pandas as pd_userID 1#电影评分排序 ratings pd.read_csv(ml-latest-small/ratings.csv) #打印前20行 #print(ratings.head(10))#电影所属类别 movies pd.read_csv(ml-latest-small/movies.cs…

怎么做思维导图?试试这种绘制方法

怎么做思维导图&#xff1f;思维导图是一种非常实用的工具&#xff0c;可以帮助我们更好地整理思路、总结知识和规划方案。但是传统的手绘或电脑软件绘制思维导图的方法需要一定的时间和技能&#xff0c;对于想要快速制作思维导图的人来说可能不太方便。下面就给大家介绍一种在…

如何测试Linux磁盘的读写速度

在Linux系统中也有很多命令可以测试硬盘的读写速度指标。以下是几个常用命令&#xff08;注意&#xff1a;在执行测试命令之前&#xff0c;请务必备份数据以避免数据丢失&#xff01; 1、dd 命令 首先挂载磁盘 mount /dev/sdb /testdd 命令可用于进行硬盘读写速度测试。 例…

idea在控制台中输出文字显示乱码

VM options中加入下面这行 -Dfile.encodingutf-8