找单独的数(位运算实现和哈希实现)

news/2025/3/12 13:32:43/文章来源:https://www.cnblogs.com/duiwoeryan/p/18767354

前言

在众多类中,如何寻找出那个与众不同的类


问题:

给n个数,不重复的共有m+1个数,其中的m个数重复了x次,一个数重复了y次,即 $n = mx + 1y$,找到这个y,总结各种O(n)时间实现的算法, 异或(x为2,y为1),位运算,哈希表,等等

在给定的条件下,我们需要找到一个数组中唯一出现 y 次的那个数字,而其他数字都出现了 x 次。为了满足 O(n) 的时间复杂度要求,我们可以使用多种方法来解决这个问题。以下是一些常见的算法和它们的实现细节:

1. 异或运算(仅适用于 x = 2, y = 1)

x = 2y = 1 时,可以使用异或运算来解决问题。因为任何数与自身异或结果为0,任何数与0异或结果为其本身。

实现代码

def singleNumber(nums):result = 0for num in nums:result ^= numreturn result# 测试样例
print(singleNumber([1, 1, 2, 2, 3]))  # 输出3

2. 位运算(适用于任意 x 和 y)

对于更一般的情况,可以使用位运算来统计每一位上的1的数量,并对 x 取模来找出那个唯一的数字。

实现代码

def singleNumber(nums, x, y):bit_count = [0] * 32  # 假设整数是32位# 统计每一位上1的数量for num in nums:for i in range(32):if (num >> i) & 1:bit_count[i] += 1# 根据bit_count数组重建结果数字result = 0for i in range(32):if bit_count[i] % x != bit_count[i] % y:if i == 31:  # 符号位处理result -= (1 << 31)else:result |= (1 << i)return result# 测试样例
print(singleNumber([1, 1, 1, 2, 2, 2, 3, 3, 3, 4], 3, 1))  # 输出4
print(singleNumber([0, 0, 0, 1, 1, 1, 2], 3, 1))  # 输出2
print(singleNumber([7, 7, 7, 3, 3, 3, 10], 3, 1))  # 输出10

3. 哈希表

在 Python 中,字典(dict)和集合(set)都是基于哈希表实现的。

  • 字典 (dict)
    哈希表实现:Python 的字典是一种无序的键值对集合,其中每个键都必须是可哈希的(即不可变且实现了__hash__()方法和__eq__()方法)。键通过其哈希值被快速映射到特定的存储位置,这使得查找、插入和删除操作在平均情况下都能达到常数时间复杂度O(1)。
    特点:键唯一性。如果尝试添加一个已经存在的键,则新值会替换旧值。

  • 集合 (set)
    哈希表实现:类似字典,集合也是一种无序的不重复元素序列。由于也是基于哈希表实现,因此它支持快速的成员检查、添加和移除操作,这些操作通常也具有平均时间复杂度O(1)。
    特点:元素唯一性。试图向集合中添加重复元素将不会产生任何效果。

哈希表方法通过记录每个数字的出现次数来找到那个唯一的数字。这种方法的时间复杂度是 O(n),但空间复杂度也是 O(n)。

字典

实现代码

from collections import Counterdef singleNumber(nums, x, y):count_dict = Counter(nums)# 找到出现次数为y的数字for num, count in count_dict.items():if count == y:return num# 测试样例
print(singleNumber([1, 1, 1, 2, 2, 2, 3, 3, 3, 4], 3, 1))  # 输出4
print(singleNumber([0, 0, 0, 1, 1, 1, 2], 3, 1))  # 输出2
print(singleNumber([7, 7, 7, 3, 3, 3, 10], 3, 1))  # 输出10

对于x=2,y=1

def hash_unique(nums:List[int])->int:hash_dicts = {}for i in nums:if i in hash_dicts:hash_dicts[i]+=1else:hash_dicts[i] = 1for k,v in hash_dicts.items():if v == 1:print(k)return k

集合

集合方法可以通过求和的方式来计算唯一的数字。假设所有数字的范围已知,可以通过求和的方式简化问题。

实现代码

def singleNumber(nums, x, y):unique_sum = sum(set(nums))total_sum = sum(nums)# 计算公式:unique_num = (unique_sum * x - total_sum) / (x - y)unique_num = (unique_sum * x - total_sum) // (x - y)return unique_num# 测试样例
print(singleNumber([1, 1, 1, 2, 2, 2, 3, 3, 3, 4], 3, 1))  # 输出4
print(singleNumber([0, 0, 0, 1, 1, 1, 2], 3, 1))  # 输出2
print(singleNumber([7, 7, 7, 3, 3, 3, 10], 3, 1))  # 输出10

注意:这种方法适用于所有数字都在一个已知范围内,并且这个范围内的所有数字都可以被枚举的情况。如果数字范围过大或者不可枚举,则不适合使用这种方法。

总结

  1. 异或运算:适用于 x = 2 且 y = 1 的情况,简单高效。
  2. 位运算:适用于任意 x 和 y,通过统计每一位上的1的数量并取模来找到唯一的数字。
  3. 哈希表:适用于任意 x 和 y,通过记录每个数字的出现次数来找到唯一的数字,但空间复杂度较高。
  4. 集合:适用于数字范围已知的情况,通过求和的方式来计算唯一的数字。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬取Microsoft Bing网站图片

说明: 这个小案例主要是访问Microsoft Bing网站去爬取“车牌”图片,代码写的时候不规范,但是效果还行文件结构为下图:具体思路#爬取html.py import requests import time from tqdm import tqdm import os url=https://cn.bing.com/images/async headers={User-Agent:Mozill…

打开组策略,提示找不到资源$(string.WHFB_DisablePostLogonCredentialCaching)(在属性 displayName 中引|用)

情况 win11家庭版不提供组策略,因此我使用了网络上提供的命令进行开启。 开启后使用win自带的搜索,搜索组策略或是gpedit都没有反应,使用命令行输入gpedit可以正常跳出窗口,然而打开组策略提示如下。未解决 https://bbs.pcbeta.com/viewthread-1688611-1-1.html https://an…

Processing (Java) 中实现2D任意图形的鼠标悬停检测 2D射线检测 模拟按钮 点击事件

引言 如果使用Processing开发应用,画面中需要设定一些按钮,而且这些按钮是不规则图形样式,甚至是以一张图片形式呈现,如何判定其轮廓,定义悬停事件、点击事件是非常核心的算法需求。本文浅析这一问题的通用解决方案。因为Processing是Java衍生语言,同样适合java语言体系。…

运行窗口无法打开软件程序的解决办法

事情起因:  本人安装了 Notepad-- 文本编辑软件,但是通过Win+R,打开运行窗口,输入Notepad-- 无法打开该软件;报错如下: 解决办法  此电脑-属性-高级系统设置-高级-环境变量  在 系统变量 里,找到 Path 变量 添加软件安装路径,并上移 确定保存,电脑重启,系统环…

牛客题解 | 为数据集行创建复合超向量

牛客题库题解题目 题目链接 复合超向量是一种将多个向量组合成一个向量的方法,其计算公式为: \[composite\ hypervector = \sum_{i=1}^{n} w_i \times v_i \]其中,\(w_i\) 是权重,\(v_i\) 是向量。 在本题中,这是一个使用超维计算(HDC)的任务,需要通过以下步骤处理数据…

【设计模式】从事件驱动到即时更新:掌握观察者模式的核心技巧

概述 定义:又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 结构 在观察者模式中有如下角色:Subject:抽象主题(抽象被…

【设计模式】探索状态模式在现代软件开发中的应用

概述 【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,就不能进行开门操作,而如果电梯门是停止状态,就可以执行开门操作。 类图如下:代码…

团队展示 (组长:金帝彪)

一、团队介绍 1.1 团队概况 1.1.1 博客展示链接 团队名称,彩虹小分队 https://www.cnblogs.com/JINjin20040207 1.1.2 团队项目描述 健康体重管理平台 1.1.3 队员风采 姓名:金帝彪 风格:谋定后动 擅长的技术:业务分析 编程的兴趣:C 希望的软工角色:业务分析师 一句话宣言:…

3.12 数字逻辑电路

1.时序逻辑电路 1.1 与组合逻辑电路(比如译码器,多路选择器,全加法器)的区别:时许逻辑电路可以存储信息 1.2 基本存储元件 1.2.1 RS锁存器(存储一个byte位的信息)(低电频使能) R:reset复位;S:set置位 R和S是两个输入端,A和B希望是两个取反状态 当S=0,表示要置位(低…

day:19 html实战

一、认识标签 1、标题标题 h1--h6 格式: <!doctype html>认识标签第一大标题 第二大标题 第三大标题 第四大标题 第五大标题 第六大标题 </body>2、常用标签 代码:常用标签段落标签,也叫p标签 斜体标签,也叫em标签 b标签,也是加粗 斜体标签 加粗标签 下划线 删…

Properties-读取配置文件中的内容

读取配置文件中的内容Properties-读取配置文件中的内容 新建子项目properties 修改POM 父POM中加上子项目module。子项目依赖父项目,打包方式jar。引入spring-boot-configuration-processor和lombok(Lombok 的安装与使用)spring-boot-configuration-processor的作用是生成配置…

matlab实现Arduino的PIL硬件仿真

使用 Arduino 硬件上的 PIL 进行代码验证和验证1. 尝试arduino的PIL程序例程-arduino_pil_bolck 1.1 准备安装包 安装arduino 硬件支持包安装编辑器MinG-w64 1.2实现步骤https: //ww2.mathworks.cn/help/simulink/supportpkg/arduino_ref/code-verification-and-validation-wit…