开荒新系列之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吧