开荒新系列之LeetCode: 001-Nim Num

开荒新系列之LeetCode

昨天和师兄聊天,他表示现在工作不太好找,要找得刷leetcode,大概刷完leetcode就能找到工作了。本人一向头脑简单,喜欢开荒,今天开始刷,争取每晚一道题。

先按最简单的排序,从第一道开始吧!

第一题 Nim Num

题目大意:
两个棋手对奕,一共有N个棋子(原文是heap),每人每次可拿1-3个棋子,谁拿走最后的1-3个棋子视为输棋。我扮演先手的棋手,寻找给出不同N时,是否一定能赢。


使用python作为第一次实现语言,可以进行快速实现呀:D

  • 首先是给出一些测试数据(我个人此刻感觉这个非常重要)
#建立data
#测试输入   测试输出
1   True
2   True
3   True
4   False
5   True
6   True 
#这个时候好像发现了,只要将对方的位置归结于4就一定能赢
7   True
8   False
#这个时候可以发现这是一个递推关系,我一定能赢->对方无论选什么一定会输->我再之后一步也一定能赢->对方再之后一步也一定会输 

所以我感觉可以按照这样的小脚本来生成一个测试集

def generateData(N=1000):
    data = [(1, True),(2,True), (3,True), (4, False)]
    if N <= 4:
        for i in xrange(N):
            yield data[i]
        return 
    for i in xrange(N):
        if i <= 3:
            yield data[i]
        else:
            data = data[1:]
            if data[0][1] is True and data[1][1] is True and data[2][1] is True:
                data.append((i+1,False))
            else:
                data.append((i+1,True))
            yield data[3]

写完之后发现,只要稍微改一下,这居然是个解法。。。。

  • 但是heap给出了很多提示, 我首先想到的是用树来分解N,使得这个东西变成一个DFS搜索问题,写完上面的生成之后,发现这个办法实在是蠢,留给以后写一写
class Solution(object):
    def canWinNim(self, n):
    """
    :type n: int
    :rtype: bool
    """
        gtr = generateData(n)
        for i in xrange(n):
            result = gtr.next()
        return result[1]

好像超时了,Orz,用生成器似乎不太好
先写到这,明天要早起呃。


洗澡前突然有了灵感,
这么强劲,不得不写。。。
这再一次证明了,
写出自己的参考数据是多么重要

新的solution:

class Solution(object):
    def canWinNim(self, n):
    """
    :type n: int
    :rtype: bool
    """
        return not n % 4 is 0

这种写法比

class Solution(object):
    def canWinNim(self, n):
    """
    :type n: int
    :rtype: bool
    """
        return n % 4 > 0

要快上一丢丢,
我的accept details中,
用 is 的写法为36ms
而 > 的写法为44ms。
以后项目中还是多多使用is吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值