LeetCode每日一题题解:剑指 Offer II 004. 只出现一次的数字 -题解-python && C++源代码

简介: LeetCode每日一题题解:剑指 Offer II 004. 只出现一次的数字 -题解-python && C++源代码

剑指 Offer II 004. 只出现一次的数字


难度中等52收藏分享切换为英文接收动态反馈


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


示例 1:


输入:nums = [2,2,3,2]

输出:3

示例 2:


输入:nums = [0,1,0,1,0,1,100]

输出:100

提示:


1 <= nums.length <= 3 * 104

-231 <= nums[i] <= 231 - 1

nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

题目思路:


这道题的思路总的来说很简答,就是将每个数变成二进制的,这么来说,数组中的所有数都变成二进制的参与本程序的运算,

对于每个数来说,不管是什么数当他变成二进制之后他的每一位不是0就是1,我们对数组中每个数变成二进制之后的每一位

进行求和,然后对3进行取余,就会得到单独出现的那位数,(因为其他的数都是出现三次的,所有对3取余之后都为0,多出来

的那个就是只出现一次的),如果这个数位1,则将1移动到i位置上,与a进行或运算,相当于在i位上赋1,如果是0则不用管

因为在移动过程中会对没有运算的地方自动补0.


python代码:

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        ans = 0  #构建变量a = 0
        for i in range(32):  #遍历32位数,因为所有数转换为二进制的话,一共可有32位
            total = sum((num >> i) & 1 for num in nums)   #定义个整数来存储数组的某位的数相加的和,所有数的某位数相加 得到all
            if total % 3:  #如果all%3 为0,则不进行如下操作,直接跳入下一个循环,因为当前补0即可
                if i == 31:  #/如果all%3 为0,则不进行如下操作,直接跳入下一个循环,因为当前补0即可
                    ans = ans - (1 << i)  #因为python对有符号数和无符号数没有区分,因此我们这里需要进行31位的判断
                else:
                    ans = ans | (1 << i)  #如果为1的话,则需要将1位移到相应的位置,然后与a进行或运算,即在a的i位上赋值1
        return ans

C++代码:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int a = 0;  //构建变量a = 0
        for (int i = 0; i < 32; i++){  //遍历32位数,因为所有数转换为二进制的话,一共可有32位
            int all = 0;    //定义个整数来存储数组的某位的数相加的和
            for (int num: nums){
                all += (num>>i)&1;  //所有数的某位数相加 得到all
            }
            if (all%3){    //如果all%3 为0,则不进行如下操作,直接跳入下一个循环,因为当前补0即可
                a |= 1<<i;    //如果为1的话,则需要将1位移到相应的位置,然后与a进行或运算,即在a的i位上赋值1
            }
        }
        return a;  //输出答案
    }
};
相关文章
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
63 6
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
57 4
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 04. 二维数组中的查找
剑指Offer题目 "二维数组中的查找" 的Python解决方案,包括非递归迭代、递归以及使用内置函数的二分查找方法,以判断一个有序的二维数组中是否含有给定整数。
39 1
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 03. 数组中重复的数字
解决剑指Offer题目 "数组中重复的数字" 的Python实现方法,通过使用字典来记录数组中每个数字的出现次数,快速找出重复的数字。
42 1
|
4月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
351 0
|
2月前
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
55 1
WK
|
3月前
|
机器学习/深度学习 Java 程序员
为什么Python比C++慢很多?
Python相较于C++较慢主要体现在:动态类型系统导致运行时需解析类型,增加开销;作为解释型语言,逐行转换字节码的过程延长了执行时间;自动内存管理和垃圾回收机制虽简化操作但也带来了额外负担;全局解释器锁(GIL)限制了多线程性能;尽管Python库方便灵活,但在性能上往往不及C++底层库。然而,Python在某些领域如数据分析、机器学习中,凭借其高级别抽象和简洁语法仍表现出色。选语言需依据具体应用场景和需求综合考量。
WK
102 1
|
4月前
|
Unix C语言 C++
Python调用C/C++
Python调用C/C++
32 2
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
58 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
34 4