谷歌经典面试题:10 枚硬币谜题。。。

71877fa358e8bf83389f6f065566b599.gif

精品推荐

《征服数据结构》专栏: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

dd7fe63f989aa1a100ebaa7803ae0cf3.gif

笔者简介

博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。

《征服数据结构》专栏

数组稀疏表(Sparse Table)单向链表双向链表块状链表跳表队列和循环队列双端队列单调队列单调栈双端栈散列表字典树(Trie树)ArrayMapSparseArray二叉树二叉搜索树(BST)笛卡尔树AVL树树堆(Treap)FHQ-Treap

……

《经典图论算法》专栏

图的介绍图的表示方式邻接矩阵转换广度优先搜索(BFS)深度优先搜索(DFS)A*搜索算法迭代深化深度优先搜索(IDDFS)IDA*算法双向广度优先搜索迪杰斯特拉算法(Dijkstra)贝尔曼-福特算法(Bellman-Ford)SPFA算法弗洛伊德算法(Floyd)

……

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值