Given an 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?

感谢cnblog博主feiling,这篇博客一方面参考了feiling的博客,也加入了自己的一些看法。

[解题思路]

要求线性时间复杂度,同时空间复杂度为O(1),即只允许开常数个空间。

最直接的思路是对每一个元素尝试查找是否有重,如果没有重,就返回。

class Solution {
public:int singleNumber(int A[], int n) {// IMPORTANT: Please reset any member data you declared, as// the same Solution instance will be reused for each test case.int i = 0, j = 0;int ans = 0;for(i = 0;i < n;i++){for(j = 0;j < n;j++){if(i == j)continue;else if(A[i] == A[j])break;else continue;}if(j == n)return A[i];}}
};

不幸的是虽然是o(n2)的时间复杂度,但是还是超时了。于是乎就得想一个o(n)的算法。

o(n)的算法只能是线性扫描一遍,可能的相法是位运算。对于异或来说:

1. 异或运算是可交换,即 a ^ b = b ^ a

2. 0 ^ a = a

那么如果对所有元素做异或运算,其结果为那个出现一次的元素,理解是a1 ^ a2 ^ ....,可以将所有相同元素交换至相邻位置,首先运算相同元素,则会产生(n - 1)/2个0异或积,剩余一个单一元素,他们的异或积为这个单一元素自己,得解。

 1 public class Solution {2     public int singleNumber(int[] A) {3         // Note: The Solution object is instantiated only once and is reused by each test case.4         if(A == null || A.length == 0){5             return 0;6         }7         int result = A[0];8         9         for(int i = 1; i < A.length; i++){
10             result = result ^ A[i];
11         }
12         return result;
13     }
14 }

本题扩展

1.一个数组中有两个元素只出现一次,其他所有元素都出现两次,求这两个只出现一次的元素

[解题思路]

将数组所有元素都进行异或得到一个不为0的结果,根据这个结果中的不为0的某一位将数组分成两组

将两组中的元素进行异或,如两个数组的异或值都不为0,则得到最后结果

2.一个数组中有一个元素只出现1次,其他所有元素都出现k次,求这个只出现1次的元素

[解题思路]

当k为偶数时,同lss

当k为奇数时,将数组中每个元素的每一位相加mod k,得到结果即位出现1次的元素,时间复杂度O(nlen),空间复杂度为O(1)

转载于:https://www.cnblogs.com/changchengxiao/p/3413294.html

[LeetCode] Single Number相关推荐

  1. [LeetCode]Single Number II

    今天室友推荐了一道LeetCode上面的练习题Single Number II,题目大概的意思是有一个整形的数组,里面只有一个数是出现一次的,其他的数都出现了三次,然后让把这个数找出来. 第一眼看到这 ...

  2. leetcode - Single Number

    今天开始刷leetcode上的题,争取校招前刷过一遍,从AC率最高的题目开始刷,不废话了,看题 题目:Single Number Given an array of integers, every e ...

  3. LeetCode Single Number I / II / III

    [1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...

  4. leetcode Single Number python

    Single Number Given an array of integers, every element appears twice except for one. Find that sing ...

  5. LeetCode Single Number III(位操作)

    问题:给出一个数组,有两个数只出现一次,其它都出现两次. 思路:先对数组求异或,得到两个数异域的结果.然后确定差异的最低位.再将数组与这个差异位作异域,得到其中的一个数.再与异域结果异域后即得到另外一 ...

  6. LeetCode Single Number II(位操作)

    问题:给出一个数组,其中只有一个数出现一次,其它数出现三次,找出出现一次的数 思路: 1.统计每位出现的次数,如果mod 3等于1,则将该位置为1,最后即得到出现一次的数. 2.使用三个变量来分别来表 ...

  7. [Leetcode] single number ii 找单个数

    Given an array of integers, every element appears three times except for one. Find that single one. ...

  8. [LeetCode] Single Number 单独的数字

    Given an array of integers, every element appears twice except for one. Find that single one. Note: ...

  9. [Leetcode] single number 找单个数

    Given an array of integers, every element appears twice except for one. Find that single one. Note:  ...

  10. LeetCode Single Number

    Given an array of integers, every element appears twice except for one. Find that single one. Note: ...

最新文章

  1. 自定义checkbox,redio等
  2. 用MySQL创建数据库和数据库表
  3. ug中文字大小设置_UG与AutoCAD的数据转换,原来还有这么简单的方法
  4. 原来还有这样一个东西,重来不知道过-linux ,ulimit
  5. netty java开发文档_《Netty官方文档》设置开发环境
  6. HDU 4548 美素数 素数题解
  7. java前沿技术_互联网百强企业架构师告诉你,Java应该这么学!云和数据超全面Java中级程序员学习路线图重磅发布!...
  8. android 退出代码
  9. android studio查看应用文件,AndroidStudio里面使用openFileOutput新建的文件如何查看
  10. 【Android实战】----从Retrofit源码分析到Java网络编程以及HTTP权威指南想到的
  11. ping、arping、fping、hping、hping3、nping
  12. ArduinoUNO实战-第六章-电位器实验
  13. Android Camera 测光梳理
  14. SQP(序列二次规划中的Marotos效应)
  15. 大数据的周边技术-这个解释很通俗
  16. 微信退还钱什么时候到账?
  17. WebForm:毒药还是利器?
  18. IBM ThinkPad F11系统恢复完全技巧
  19. 如何查看三菱PLC生产日期与版本信息?
  20. canvas整体放大_Canvas实现图片放大缩小移动操作

热门文章

  1. windows tasklist 查看应用、进程
  2. RedHat7.0 设置weblogic开机自启动
  3. java错误 找不到或无法加载主类
  4. java clone方法_java安全编码指南之:方法编写指南
  5. python框架django入门_web框架之Django(python3入门)
  6. php mssql 新 id,MSSQL获取当前插入数据的id
  7. hibernate createsqlquery delete多个表_go语言教程哪里有?xorm表基本操作及高级操作...
  8. python日历提醒_python打印日历
  9. Spark SQL 1.x之Hive Context
  10. 使用jena 进行RDF推理