【查找算法】找到数组中只出现1次的数字(附Python实现代码)

简介: 找到数组中只出现1次的数字(附Python实现代码)

问题

给定一个整型数组nums,除某个元素仅出现1次,其余元素都出现3次,找出并返回只出现了1次的元素。

约束条件
1 <= nums.length <= 3 10 * 4
-2 * 31 <= nums[i] <= 2 * 31 - 1 (
表示幂)

示例一:
输入:nums = [2,2,2,3]
输出:3
示例二:
输入:nums = [4,4,6,6,4,5,6]
输出:5

解题思路

整体思路: 通过与数组中元素的二进制位一位一位的比较,找到某一位有且唯一不同的元素。

这道题涉及到位运算,通过与运算&,移位<<,一起异或^找到指定元素,可以先了解位运算相关基础知识。

  • 通过bit = 1 << i结合i循环实现,<<是左移位,bit用来与数组元素进行比较。
  • 进入第i次循环,bit的第i位是1,其余都是0,此时循环数组中的元素,如果数组元素与bit的第i位相同,count计数加一,数组循环结束后:
    -- 如果count % 3 ==0,说明该位相同的数是3的整数倍个,因此要找的元素这一位不是1
    -- 如果count % 3 ==1,说明该位相同的数不是3的整数倍个,因此要找的元素这一位是1
  • 确定该元素的第i位是0或1之后,bit就要移位进行下一次的比较了,因此我们要把刚才的结果存起来,这时候就要用到异或^,设置一个二进制位全为0的临时变量tmp,0和0异或为0、0个1异或为1,这样就能存下来了。
  • exp:[1,1,1,0,0,0,3,3,3,4]
    -- 比较数组元素二进制第0位,有6个是1,4个是0,count = 6说明单独的这个数第0位不是1而是0,tmp不需要变化;
    -- 再比较第1位,有3个是1,7个是0,count = 3说明单独的这个数第1位不是1而是0,tmp不需要变化;
    -- 再比较第2位,有1个是1,9个是0,count = 1说明单独的这个数第2位是1,tmp与此时的bit异或。
    -- ...一直比较到第31位
    最后我们得到的tmp就是那个单独存在的元素。

代码实现

class Solution(object):
    def findNumber(self, nums):
        tmp = 0
        for i in range(32):
            count = 0
            bit = 1 << i # 1,10,100,1000...
            print(f'bit:{bin(bit)}')
            for num in nums:
                print(f'num:{bin(num)}')
                if num & bit:
                    count += 1
            print(f'count:{count}')
            if count %3 != 0:
                tmp ^= bit
                print(f'tmp:{bin(tmp)}')
        return tmp

s = Solution()
nums = [1,2,1,2,1,4,2]
ans = s.findNumber(nums)
print(ans)
相关文章
|
1天前
|
设计模式 缓存 测试技术
Python中的装饰器:功能增强与代码复用的艺术####
本文将深入探讨Python中装饰器的概念、用途及实现方式,通过实例演示其如何为函数或方法添加新功能而不影响原有代码结构,从而提升代码的可读性和可维护性。我们将从基础定义出发,逐步深入到高级应用,揭示装饰器在提高代码复用性方面的强大能力。 ####
|
2天前
|
缓存 测试技术 数据安全/隐私保护
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第29天】本文通过深入浅出的方式,探讨了Python装饰器的概念、使用场景和实现方法。文章不仅介绍了装饰器的基本知识,还通过实例展示了如何利用装饰器优化代码结构,提高代码的可读性和重用性。适合初学者和有一定经验的开发者阅读,旨在帮助读者更好地理解和应用装饰器,提升编程效率。
|
9天前
|
开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第22天】在Python的世界里,装饰器是一个强大的工具,它能够让我们以简洁的方式修改函数的行为,增加额外的功能而不需要重写原有代码。本文将带你了解装饰器的基本概念,并通过实例展示如何一步步构建自己的装饰器,从而让你的代码更加高效、易于维护。
|
6天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
10 3
|
5天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
11天前
|
开发框架 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第20天】在编程的海洋中,简洁与强大是航行的双桨。Python的装饰器,这一高级特性,恰似海风助力,让代码更优雅、功能更强大。本文将带你领略装饰器的奥秘,从基础概念到实际应用,一步步深入其内涵与意义。
|
9天前
|
机器学习/深度学习 缓存 数据挖掘
Python性能优化:提升你的代码效率
【10月更文挑战第22天】 Python性能优化:提升你的代码效率
10 1
|
9天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
27 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
9天前
|
缓存 算法 数据处理
Python性能优化:提升代码效率与速度的秘诀
【10月更文挑战第22天】Python性能优化:提升代码效率与速度的秘诀
8 0
|
机器学习/深度学习 算法 Python
Python编程:查找算法之顺序查找和二分查找
Python编程:查找算法之顺序查找和二分查找
148 0