精品推荐:
《征服数据结构》专栏:50多种数据结构彻底征服
《经典图论算法》专栏:50多种经典图论算法全部掌握
You are blindfolded and 10 coins are placed in front of you on the table. You are allowed to touch the coins but can’t tell which way up they are by feel. You are told that there are 5 coins head up, and 5 coins tails up but not which ones are which.
Can you make two piles of coins each with the same number of heads up? You can flip the coins any number of times.
翻译:
你被蒙住双眼,桌子上摆着 10 枚硬币。你可以触摸这些硬币,但不能凭感觉判断它们哪个朝上。你被告知有 5 枚硬币正面朝上,5 枚硬币反面朝上,但不知道哪一枚是正面朝上,哪一枚是反面朝上。
你能否把硬币分成两堆,每堆正面朝上的硬币数量相同,你可以任意次翻转硬币,如果可以,应该怎么操作?
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第136题:只出现一次的数字。
问题描述
来源:LeetCode第136题
难度:简单
给你一个非空整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例1:
输入:nums = [2,2,1]
输出:1
示例2:
输入:nums = [4,1,2,1,2]
输出:4
1 <= nums.length <= 3 * 10^4
-3 * 10^4 <= nums[i] <= 3 * 10^4
除了某个元素只出现一次以外,其余每个元素均出现两次。
问题分析
这题说的是一个数组中只有一个数字出现一次,其他数字都出现两次,让找出只出现一次的那个数字。
这题我们可以使用异或运算来解决,异或运算有下面几个规律:
a ^ 0 = a
0 ^ a = a
a ^ a = 0
a ^ b ^ c = a ^ c ^ b
1,任何数字和 0 异或还是他自己。
2,任何数字和他自己异或结果都是 0。
3,异或运算具有交换律。
根据上面的规律,我们只需要把所有的数字都异或一遍即可,这样出现两次的数字异或结果都是 0 ,0 和只出现一次的那个数字异或还是那个数字,也就是我们需要的结果。
JAVA:
public int singleNumber(int[] nums) {
int ans = 0;
for (int num : nums)
ans ^= num;
return ans;
}
C++:
public:
int singleNumber(vector<int> &nums) {
int ans = 0;
for (auto const num: nums)
ans ^= num;
return ans;
}
Python:
def singleNumber(self, nums: List[int]) -> int:
ans = 0
for num in nums:
ans ^= num
return ans
笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。
数组,稀疏表(Sparse Table),单向链表,双向链表,块状链表,跳表,队列和循环队列,双端队列,单调队列,栈,单调栈,双端栈,散列表,堆,字典树(Trie树),ArrayMap,SparseArray,二叉树,二叉搜索树(BST),笛卡尔树,AVL树,树堆(Treap),FHQ-Treap
……
图的介绍,图的表示方式,邻接矩阵转换,广度优先搜索(BFS),深度优先搜索(DFS),A*搜索算法,迭代深化深度优先搜索(IDDFS),IDA*算法,双向广度优先搜索,迪杰斯特拉算法(Dijkstra),贝尔曼-福特算法(Bellman-Ford),SPFA算法,弗洛伊德算法(Floyd)
……