题目:
给你一个正整数 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
提交通过,我乐了:

不同整数在109天后数量的计算优化
文章讨论了一个编程问题,初始时桌上有一个正整数n,每天操作后桌上会增加一些整数。原解法使用队列模拟过程,但其实可以通过递推简化为n-1。作者通过观察发现,除1之外,所有数字都能找到至少一个满足条件的i,使得x%i=1。
1424





