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

剑指 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.mfbz.cn/a/59699.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rpc原理

dubbo原理 1、RPC原理 一次完整的RPC调用流程&#xff08;同步调用&#xff0c;异步另说&#xff09;如下&#xff1a; 1&#xff09;服务消费方&#xff08;client&#xff09;调用以本地调用方式调用服务&#xff1b; 2&#xff09;client stub接收到调用后负责将方法、参数…

解密SpringMVC:探秘常用注解,让你的Java应用飞速起航!

这里写目录标题 什么是 Spring MVC&#xff1f;常用注解RequestMappingRequestParamRequestBodyPathVariableRequestPart 什么是 Spring MVC&#xff1f; Spring MVC是Spring框架中的一个模块&#xff0c;是基于Java的Web应用程序开发框架。它提供了一种用于构建灵活、高效、可…

数学建模-爬虫系统学习

尚硅谷Python爬虫教程小白零基础速通&#xff08;含python基础爬虫案例&#xff09; 内容包括&#xff1a;Python基础、Urllib、解析&#xff08;xpath、jsonpath、beautiful&#xff09;、requests、selenium、Scrapy框架 python基础 进阶&#xff08;字符串 列表 元组 字典…

如何使用ONLYOFFICE+ffmpeg来给视频文件打马赛克

如何使用ONLYOFFICEffmpeg来给视频文件打马赛克 我这里之前写过很多关于ONLYOFFICE使用、安装的系列图文&#xff0c;也写过很多关于ffmpeg使用的图文&#xff0c;那么这次继续&#xff0c;把这两个开源软件放在一起&#xff0c;能碰撞出什么火花般的功能来。 这就是给视频文…

【C#学习笔记】内存管理

文章目录 分配内存释放内存GC标记清除算法分代算法 .NET的GC机制有这样两个问题&#xff1a; 官方文档 自动内存管理 自动内存管理是CLR在托管执行过程中提供的服务之一。 公共语言运行时的垃圾回收器为应用程序管理内存的分配和释放。 对开发人员而言&#xff0c;这就意味着…

凯迪正大—SF6泄漏报警装置的主要特点

SF6泄漏报警系统主要特点 ① 系统采用声速原理&#xff0c;可定量、实时在线测量SF6泄漏气体含量&#xff0c;克服了传统测量方法如负电晕放电法和卤素传感器法只能定性判别是否越限的缺陷&#xff0c;能够准确得到气体中SF6含量。 ② 系统采用双差分处理方法&#xff0c;有效…

软件测试需求分析的常用方法

软件测试需求分析时&#xff0c;应要求产品人员对需求进行讲解&#xff0c;并使用相对应的方法进行科学分析&#xff0c;否则无法保障软件测试的完整性和科学性&#xff0c;从而造成在项目中后期Bug频出、风险增大等问题。 而常用的测试需求分析的方法&#xff1a; 1、功能分解…

设计图一般都用什么工具制作?

每个设计师都需要设计图制作软件对设计图软件的选择也有一些需求&#xff0c;可以提高一些效率。网上有很多免费的PC设计软件。本文推荐了2023年5款易用的设计图制作软件 1.即时设计 即时设计是一款免费的在线 UI 设计工具&#xff0c;无系统限制&#xff0c;浏览器打开即可使…

【Leetcode刷题】模拟

本篇文章为 LeetCode 模拟模块的刷题笔记&#xff0c;仅供参考。 目录 一. 字符串Leetcode43.字符串相乘Leetcode592.分数加减运算Leetcode68.文本左右对齐 二. 矩阵Leetcode54.螺旋矩阵Leetcode885.螺旋矩阵 IIILeetcode498.对角线遍历Leetcode874.模拟行走机器人 三. 数组Lee…

淘宝店铺数据API接口 店铺详情数据API 店铺所有商品API接口

引言 在电商平台上&#xff0c;店铺所有商品API接口是一项非常重要且有着广泛应用的技术。它使得开发者能够方便地获取和管理店铺中的所有商品信息&#xff0c;进而实现自动化的商品管理和数据分析。本文将详细介绍店铺所有商品API接口的定义、功能以及调用流程&#xff0c;并附…

idea打开传统eclipse项目

打开传统web项目 1.打开后选择项目文件 2.选择项目结构 3.设置jdk版本 4.导入当前项目模块 5.选择eclipse 6. 设置保存目录 7.右键模块&#xff0c;添加spring和web文件 8. 设置web目录之类的&#xff0c;并且创建打包工具 9.如果有本地lib&#xff0c;添加为库 最后点击应用&…

掌握 JVM 的参数及配置

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ JVM&#xff08;Java虚拟机&#xff09;是Java编程语言的核心组件之一&#xff0c;它负责执行Java程序&#xff0c;并提供一系列参数和配置选项&#xff0c;可以调整Java程…

决策树与随机森林

目录 决策树是&#xff1a;Why&#xff1a;How&#xff1a;基本概念决策树生成举例决策树缺点参考 Demo 随机森林1.是&#xff1a;2.Why&#xff1a;3.How&#xff1a;参考 Demo 决策树 是&#xff1a; 1.一种有监督的分类&#xff08;或预测&#xff09;算法。 2.利用属性、…

Ubuntu安装MySQL 8.0与Navicat

目录 Ubuntu安装MySQL 8.0 1、更新软件包列表 2、安装 MySQL 8.0 3、启动 MySQL 服务 5、确保MySQL服务器正在运行 5、root 用户的密码 6、登录MySQL&#xff0c;输入mysql密码 7、MySQL默认位置 Ubuntu安装Navicat 1、下载 Navicat 2、额外的软件包 3、执行命令 U…

10分钟理解React生命周期

前言 学习React&#xff0c;生命周期很重要&#xff0c;我们了解完生命周期的各个组件&#xff0c;对写高性能组件会有很大的帮助。 一、简介 React /riˈkt/ 组件的生命周期指的是组件从创建到销毁过程中所经历的一系列方法调用。这些方法可以让我们在不同的时刻执行特定的…

uniapp自定义头部导航栏

有时我们需要一些特殊的头部导航栏页面&#xff0c;取消传统的导航栏&#xff0c;来增加页面的美观度。 下面我就教大家如何配置&#xff1a; 一、效果图 二、实现 首先在uniapp中打开pages.json配置文件&#xff0c;在单个路由配置style里面设置导航栏样式​​​​​​nav…

【计算机网络】NAT技术

文章目录 1. NAT技术简介2. 使用NAT技术转换IP的过程3. NAPT4. NAT技术的缺陷5. NAT和代理服务器 1. NAT技术简介 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;技术&#xff0c;是解决IP地址不足的主要手段&#xff0c;并且能够有效避免外…

网络安全 Day26-PHP 简单学习

PHP 简单学习 1. 为什么要学习PHP2. PHP语法3. php 变量4. 字符串数据5. PHP 函数6. 数组 1. 为什么要学习PHP php存量多开源软件多很多安全流程 渗透方法 sql注入基于PHP语言入门简单 2. PHP语法 格式: <?php 内容?>或<?内容?>结尾分号例子<?php phpin…

[Docker实现测试部署CI/CD----自由风格的CI操作[最终架构](5)]

目录 11、自由风格的CI操作&#xff08;最终&#xff09;Jenkins容器化实现方案修改 docker.sock 权限修改 Jenkins 启动命令后重启 Jenkins构建镜像推送到Harbor修改 daemon.json 文件Jenkins 删除构建后操作Jenkins 添加 shell 命令重新构建 Jenkins通知目标服务器拉取镜像目…

【TypeScript】中定义与使用 Class 类的解读理解

目录 类的概念类的继承 &#xff1a;类的存取器&#xff1a;类的静态方法与静态属性&#xff1a;类的修饰符&#xff1a;参数属性&#xff1a;抽象类&#xff1a;类的类型: 总结&#xff1a; 类的概念 类是用于创建对象的模板。他们用代码封装数据以处理该数据。JavaScript 中的…
最新文章