找数组中只出现一次的元素
来源:互联网 发布:阿里巴巴旗下所有软件 编辑:程序博客网 时间:2024/05/17 03:18
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
数组中只有一个元素出现一次,其余元素都出现两次,在线性时间类,不使用额外的空间找出只出现一次的那个元素。
先上AC代码:
public class Solution { public int singleNumber(int[] A) { int n = A.length; if(n == 1) return A[0]; int result = A[0]; for(int i = 1 ; i < n ; i++) { result ^= A[i];//异或运算的可交换性 } return result; }}
这个题的标准做法是利用异或运算的这两个法则
1. a ^ b = b ^ a
2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
举个例子:
1^2^3^4^4^3^2的结果是啥呢?
一眼大概开不出来。。
根据上面两个法则,改变一下顺序吧
改成2^2^3^3^4^4^1
现在,结果显然是1.
如果其余元素都出现三次,找出那个只出现一次的元素呢?
思路:设置一个 大小为 32 (int 为 4byte) 的桶, 若 integer 在第 i 位为1, 则第 i 个桶数字加 1. 最后, 把桶里不是 3 的倍数的那些 1 组合起来拼成结果。
public int uniqueNum(int a[]){int n = a.length;int[] container = new int[32];for(int i = 0; i < 32; i++)//初值化这32个桶container[i] = 0;for(int i=0; i<n; i++)//遍历每个数组元素,如果在某一位上为1,则将1加入对应的桶里{for(int j=0; j<32; j++) container[j] += ((a[i]>>j) & 1);}int result = 0;for(int k=0; k < 32; k++)//找出桶中“1”的个数不是3的倍数的桶{if(container[k]%3 !=0)result += 1<<k;//将符合条件的桶里的数字组合就是只出现一次的数}return result;}
扩展:如何用一个语句判断一个整数是不是二的整数次幂?
PS:n&(n-1)==0;//二进制数只有一位位1,则该数是2的整数次幂.
0 0
- 找数组中只出现一次的元素
- 找数组中只出现一次的元素--位运算
- 数组中只出现一次的元素
- 找出一个数组中只出现过一次的元素
- 查找数组中只出现一次的元素
- 找出数组中只出现一次的元素
- Leetcode260. 找出数组中只出现一次的两个元素
- Single Number 数组找只出现一次的数@LeetCode
- C++找数组中只出现一次的两个数并保存(牛客剑指offer)
- 找数组中只出现一次的两个数 位运算
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- [Unix下C/C++开发] unix编程书籍推荐
- 数据结构:图的实现--邻接矩阵
- 黑马程序员——Java面向对象(五)
- 关于数组的引用和引用的数组
- [Java]Java的静态构造函数 多线程下安全的单例模式
- 找数组中只出现一次的元素
- 关于Java中按值传递和按引用传递的问题详解
- 设计模式C++实现二 ——策略模式
- HDU 3483 A Very Simple Problem 矩阵构造
- 关于string 比较和cmp函数
- membership(2)---注册篇
- 数据结构:图的实现--邻接表
- Jsp读取数据库返回json数据,Android客户端接收json
- intellij idea的插件开发小结