前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode - Nim游戏 & 只出现一次的数字

LeetCode - Nim游戏 & 只出现一次的数字

作者头像
晓痴
发布2019-10-12 19:05:18
3730
发布2019-10-12 19:05:18
举报
文章被收录于专栏:曌的晓痴曌的晓痴

LeetCode第292题和第136,难度都是简单。

原题地址:https://leetcode-cn.com/problems/nim-game/ & https://leetcode-cn.com/problems/single-number/

题目描述

Nim游戏:

你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。

你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。

只出现一次的数字:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

解题思路:

先说Nim游戏,这题我是用Java解的。两个人轮流拿石头,一次1-3块,那么如果只有1-3块石头,那么肯定是你赢。只要是4块,拿肯定是对手赢。那么放大来看,每次都取走1-3块的你,如果是4的整数倍的石头,那么无论如何都会给对方剩下石头。所以必赢的情况是石头不为4的倍数的时候。

再看只出现一次的数字,这题是用的Golang。我用的方法是遍历所有数字,然后使用异或运算的方式。一个数异或本身等于0。鉴于其他元素都出现了两次,所以唯一的数就是所有数异或的结果。当然还有的办法,比如使用Hash,或者使用列表计数的方式。

中文官网题解:

https://leetcode-cn.com/problems/nim-game/solution/

https://leetcode-cn.com/problems/single-number/solution/

个人题解:

代码语言:javascript
复制
public class Solution {
    public boolean canWinNim(int n) {
        return n % 4 != 0;
    }
}

func singleNumber(nums []int) int {
    var result int = 0
  for _,v := range nums{
    result = result ^ v
  }
  return result
}

结果:

Nim游戏这题简单,解题方式也很简单,所以大家都挺快的。

只出现一次的数字,用异或运算毕竟还是比不过更快的啊。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 曌的晓痴 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档