数据结构与算法[LeetCode]—数组中出现次数异与其他数的一个数
2013-11-13 15:00
302 查看
Single Number
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?
解决思路:
特点:一个数字出现一次,其他的出现两次。那么异或运算的性质:任何一个数异或它自己都等于0。而本题出现一次的数恰好只有一个。那么,将数组依次从前向后进行异或,出现两次的数都抵消掉。最后剩余的数就恰好是那只出现一次的一个。
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
解题思路:
数出现两次,我们可以用“异或”来抵消掉,出现三次异或就不行了。
但是我们还是可以利用“抵消”这个原理,逐位考虑,我们记录所有数在该位上出现1的次数,超过三次清0,如果遍历后该位还是为1,那说明要找的那个数该位就是1,否则该位就是0。
参考:
/article/8613182.html
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?
解决思路:
特点:一个数字出现一次,其他的出现两次。那么异或运算的性质:任何一个数异或它自己都等于0。而本题出现一次的数恰好只有一个。那么,将数组依次从前向后进行异或,出现两次的数都抵消掉。最后剩余的数就恰好是那只出现一次的一个。
class Solution { public: int singleNumber(int A[], int n) { int i,ret=0; for(i=0;i<n;++i){ ret=ret^A[i]; } return ret; } };
Single Number II
Given an array of integers, every element appears three times except for one. Find that single one.Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
解题思路:
数出现两次,我们可以用“异或”来抵消掉,出现三次异或就不行了。
但是我们还是可以利用“抵消”这个原理,逐位考虑,我们记录所有数在该位上出现1的次数,超过三次清0,如果遍历后该位还是为1,那说明要找的那个数该位就是1,否则该位就是0。
参考:
/article/8613182.html
/* 思想:逐位考虑,如果某位上1出现的次数为 3*k +1 的话,那么只出现一次 的数在该位必定为1。 注意:MASK要用unsigned,而不是int */ class Solution{ public: int singleNumber(int A[],int n) { unsigned int ret=0; for(int i=0;i<32;i++) { const unsigned int MASK=(1<<i); int t=0; for(int j=0;j<n;j++) t+=(A[j]&MASK)>0?1:0; ret|=(t%3==0)?0:MASK; } return ret; } };
相关文章推荐
- [LeetCode169]Majority Element求一个数组中出现次数大于n/2的数
- 给定一个数组,除了两个数只出现一次以外,其他数都出现了两次。
- 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在
- Java给定一个字符串数组,判断每个字符出现次数
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 求一个数组中重复元素出现最多值,最大的元素及出现次数,次数相同时,取最大值,优先考虑次数
- 求一个数组中出现次数最多的数
- leetcode169---Majority Element(数组中出现次数超过一半的数)
- 统计一个数字在排序数组中出现的次数
- leetcode解题之34. Search for a Range java 版(数字在排序数组中出现的次数)
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次
- 一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数
- 一个简单的算法---实现找出数组中一个数字出现次数最多的数字
- 一个整型数组里除了一个数字之外,其他的数字都出现了两次。要求时间复杂度是O(n),空间复杂度是O(1),如何找出数组中只出现一次的数字
- 【二分查找】在排序数组中,找出给定数字的出现次数 以及二分其他应用
- 一个数组中其他数都是成对出现只有一个个数只出现一次
- 在一个长度为n的整形数组a里,除了三个数字只出现一次外,其他的数字都出现了2次。请写程序输出任意一个只出现一次的数字
- 【C语言】一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字!
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。查出其他两个只出现一次的数
- 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数