首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode SingleNumber I,II,III

LeetCode SingleNumber I,II,III

原创
作者头像
大学里的混子
修改于 2018-10-24 01:49:59
修改于 2018-10-24 01:49:59
49500
代码可运行
举报
文章被收录于专栏:LeetCodeLeetCode
运行总次数:0
代码可运行

136. Single Number


Given a non-empty array of integers, every element appears twice except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

代码语言:txt
AI代码解释
复制
Input: [2,2,1]
Output: 1

Example 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: [4,1,2,1,2]
Output: 4

题目大意:一个数组中只有一个数字只出现一次,其他的都出现两次,求这个只出现一次的数字

代码语言:java
AI代码解释
复制
class Solution {
     public int singleNumber(int[] nums) {
            if (nums == null || nums.length == 0) return 0;
            int x = 0;
            for (int i = 0; i < nums.length ;i++){
                x = x^nums[i];
            }
            return x;
        }
}

由于,异或运算支持交换律和结合律,所以,只要是出现次数为偶数次的数字,采用异或运算,结果为0;如此一来,如果数组中的一个数字只出现一次,那么最后的异或运算的结果就是这个数字。

137. Single Number II

Given a non-empty array of integers, every element appears three times except for one, which appears exactly once. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: [2,2,3,2]
Output: 3

Example 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input: [0,1,0,1,0,1,99]
Output: 99

题目大意:只有一个数字是出现一次,其他的数字都是出现三次。

代码语言:java
AI代码解释
复制
class Solution {
   public int singleNumber(int[] nums) {
        int a = 0;
        int b = 0;
        for (int n : nums) {
            a = (a^n) & (~b);
            b = (b^n) & (~a);
        }
        return a;
    }
    
}

数组为[2,2,2,3],一共有四个元素,进行四次循环。

第一次循环,b=(0000^0010)&1111=0010=2,a=(0000^0010)&1101=0000=0

第二次循环,b=(0010^0010)&1111=0000=0,a=(0000^0010)&1111=0010=2

第三次循环,b=(0000^0010)&1101=0000=0,a=(0010^0010)&1111=0000=0

第四次循环,b=(0000^0011)&1111=0011=3,a=(0000^0011)&1100=0000=0

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 如果是出现两次的话,用一个bit就可以
    比如 b,初始为051次出现时, b=552次出现是, b清空为0,表示b可以去处理其他数字了
    所以,最后 如果 b !=0的话,b记录的就是只出现了一次的那个数字
    
    ->公式就是 b = b xor i  或者 b = b^i


    那么,如果是三次的话,香浓定理,需要用2bits进行记录

    当5第一次出现的时候,b = 5, a=0,  b记录这个数字
    当5第二次出现的时候,b = 0, a=5, a记录了这个数字
    当5第三次出现的时候,b = 0, a=0, 都清空了,可以去处理其他数字了
    所以,如果有某个数字出现了1次,就存在b中,出现了两次,就存在a中,所以返回 a|b

    公式方面 ,上面两次的时候,b清空的公式是 b = b xor i
            而第三次时,b要等于零,而这时a是True,所以再 & 一个a的非就可以,b = b xor & ~a
    -> b = b xor i & ~ a
       a = a xor i & ~b

260. Single Number III

Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

Example:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Input:  [1,2,1,3,2,5]
Output: [3,5]

Note:

  1. The order of the result is not important. So in the above example, [5, 3] is also correct.
  2. Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
代码语言:java
AI代码解释
复制
public int[] singleNumber(int[] nums) {
       int x = 0;
        for ( int num :nums){
            x = x ^num;
        }
        int [] res = new int[2];
        int n = x & -x;
        for (int i = 0 ; i <nums.length;i++){
            if ((n & nums[i]) !=0){
                res[0] ^= nums[i];
            }else {
                res[1] ^= nums[i];
            }
        }
        return res;
    }
  1. 先将所有的数字进行异或运算,那么得到的结果就是这两个数字的异或运算结果,并且结果不为0
  2. 找到上述结果中的某个为1的位,那么,根据整个数组中这一位是1还是0,分为两个数组,第一个数组:这一位为0的数(包括重复的数和单独的一个数),第二个数组:这一位为1的数(包括重复的数和另一个单独的一个数)
  3. 对这两组数分别全部异或运算处理,那么得到的两个结果就是这两个单独的数

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
leetcode-137-Single Number II-第二种解法
题目描述: 详细的题目描述见上一篇博客《leetcode-137-Single Number II-第一种解法》,这里简单说一下。 有一个数组,所有元素都出现了三次,除了一个元素只出现了一次。输出这个只出现一次的元素。 要求时间复杂度O(n),空间复杂度O(1)。 要完成的函数: int singleNumber(vector<int>& s)  说明: 上一篇博客中提出的方法很容易理解,但是不是O(n)的时间复杂度,而是O(n^2),这点应该很多朋友都能看出来。 今天给大家分享一个O(n)的方法,先贴出简
chenjx85
2018/05/21
6.3K1
leetcode-136-Single Number
题目描述: Given an array of integers, every element appears twice except for one. Find that single one.
chenjx85
2018/05/21
7480
LeetCode笔记:136. Single Number
我能想到的最直接的思路就是先排序然后从头到尾比较后找出那个唯一的数字,但是这种思路很简单粗暴,感觉一定不是出题人想要的答案,而且并不太能满足注意事项,但想不出别的我只能先这样实现了,然后我看了看别人的高级做法顿时觉得思路清奇实在是精妙无比。
Cloudox
2021/11/23
2690
LeetCode 136:只出现一次的数字 Single Number
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
爱写bug
2019/10/12
4650
​LeetCode刷题实战136:只出现一次的数字
https://leetcode-cn.com/problems/single-number/
程序员小猿
2021/01/19
3000
LeetCode通关:求次数有妙招,位运算三连
大家好,我是刷题困难户老三,这一节我们来刷几道很有意思的求次数问题,它们都有同一类非常巧妙的解法。
三分恶
2021/08/06
3980
LeetCode笔记:137. Single Number II
合集:https://github.com/Cloudox/LeetCode-Record
Cloudox
2021/11/23
2010
【leetcode系列】136. 只出现一次的数字
https://leetcode.com/problems/single-number/description/
lucifer210
2019/08/16
3970
【leetcode刷题】T34-只出现一次的数字 II
Given a non-empty array of integers, every element appears three times except for one, which appears exactly once. Find that single one.
木又AI帮
2019/07/17
3200
一篇文章搞懂面试中leetcode位操作算法题Single Number落单的数落单的数 IISingle Number IISingle Number III落单的数 IIINumber of 1
本文将根据题目总结常用的位操作常用的解决算法问题的技巧 如读者对基本的位操作概念还不熟悉,可以先参考笔者的文章浅谈程序设计中的位操作http://www.jianshu.com/p/294fc6605bb1
desperate633
2018/08/22
3970
一篇文章搞懂面试中leetcode位操作算法题Single Number落单的数落单的数 IISingle Number IISingle Number III落单的数 IIINumber of 1
LeetCode Single Number题目分析代码
Given an array of integers, every element appears twice except for one. Find that single one.
desperate633
2018/08/22
2960
LeetCode Single Number题目分析代码
C++版 - 剑指Offer 面试题40:数组中只出现一次的两个数 题解
面试题40:数组中只出现一次的两个数 提交网址:  http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=13&
Enjoy233
2019/03/05
1.1K0
Leetcode Single Number II (面试题推荐)
还记得《剑指offer》和《编程之美》等书上多次出现的找一个数组中只出现一次的数那个题吗?
xindoo
2021/01/21
3570
【leetcode刷题】T33-只出现一次的数字
Given a non-empty array of integers, every element appears twice except for one. Find that single one.
木又AI帮
2019/07/17
3780
leetcode-268-Missing Number(异或)
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.
chenjx85
2019/03/14
5790
Single Number and Single Number II
[1] Given an array of integers, every element appears twice except for one. Find that single one. [2] Given an array of integers, every element appears three times except for one. Find that single one. (better solution is needed) Note: Your algorithm sho
猿人谷
2018/01/17
1.2K0
LeetCode笔记:260. Single Number III
最简单的方法就是排序后,依次检查相邻两个数是否相等,当然遇到相等的就要跳一个数字再进行检查,遇到不相等的就记录下来是结果,注意如果单个的元素排序后在最末尾,要单独处理。
Cloudox
2021/11/23
3420
【前端算法】只出现一次的数字 II,位运算符:NOT,AND 和 XOR
只出现一次的数字 II image 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,3,2] 输出:3 示例 2: 输入:[0,1,0,1,0,1,99] 输出:99 解题思路 1.遍历输入数组,统计每个数字出现的次数,最后返回出现次数为 1 的数字。 2.位运算符:NOT,AND 和 XOR 解法一 统计次数+筛选 解法比较常规 1.统计每个元
微芒不朽
2022/09/06
4460
【前端算法】只出现一次的数字 II,位运算符:NOT,AND 和 XOR
Leetcode 题目解析之 Single Number
Given an array of integers, every element appears twice except for one. Find that single one.
ruochen
2022/01/14
1.3K0
【LeetCode每日打卡】136. Single Number
Given a non-empty array of integers, every element appears twice except for one. Find that single one.
韩旭051
2020/06/23
3750
相关推荐
leetcode-137-Single Number II-第二种解法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档