题目:
给你一个正整数 n
,开始时,它放在桌面上。在 109
天内,每天都要执行下述步骤:
- 对于出现在桌面上的每个数字
x
,找出符合1 <= i <= n
且满足x % i == 1
的所有数字i
。 - 然后,将这些数字放在桌面上。
返回在 109
天之后,出现在桌面上的 不同 整数的数目。
注意:
- 一旦数字放在桌面上,则会一直保留直到结束。
%
表示取余运算。例如,14 % 3
等于2
。
思考:
用一个队列,记录在桌上且还未判断的数字x,每次取出队首的数,找出符合条件的数字i,然后将i加入队列。代码如下:
class Solution(object):
def distinctIntegers(self, n):
"""
:type n: int
:rtype: int
"""
import Queue
num = 1 # 桌上不同整数的数目
if n == 1 or n == 2:
return num
visited = [0] * (n-2)
# 数组记录每个数字i是否已经放到桌上,避免重复判断(刨除1,因为任何数对1取余都不可能为1;刨除n,因为n已经在桌上了)
q = Queue.Queue()
q.put(n) # 队列q记录桌上的还未判断过的数字
while not q.empty(): # 队列为空时退出循环
x = q.get() # 取出队首的数字
for i in range(2, n):
if visited[i-2] == 0 and x % i == 1:
q.put(i)
num += 1
visited[i-2] = 1
return num
提交通过:
我寻思着耗时怎么那么长呢,再仔细看一眼题目,我悟了,对于每个数字x,(x-1)一定满足x%(x-1)=1啊!那么对于数字(x-1),(x-2)就满足(x-1)%(x-2)=1......以此类推,从x到2都会放到桌上,只有1不能放,因为任何数对1取余都是0。那么,桌上全部的数字就有n到2一共n-1个。。。
代码就三句:
class Solution(object):
def distinctIntegers(self, n):
"""
:type n: int
:rtype: int
"""
if n == 1:
return 1
return n-1
提交通过,我乐了: