题目
一开始看着毫无头绪。
讨论区思路
- target 正负号不影响结果
- 假设所有的step都向右的和为s,这时转换一个数字n向左,即减去这个数字的两倍(s - 2 * n)
- 最多只有一个数字向左,即可达到target
- 因为 s 需要减去一个偶数2*n,所以target 与 s 必须同为偶数,或者奇数
- 完成
class Solution(object):
def reachNumber(self, target):
target = abs(target)
n = int(math.ceil(math.sqrt(1 + 8 * target)/2 - 0.5)) # 一元二次方程的解
while target % 2 != n * ( n + 1 ) / 2 % 2: # 同为奇数/偶数
n += 1
return n
我的代码
按照上面的思路,我组织了如下的代码:
class Solution(object):
def reachNumber(self, target):
"""
:type target: int
:rtype: int
"""
n=1
target=abs(target)
if target==1:
return 1
while n*(1+n)<target*2:
n+=1
print(n)
while n*(1+n)/2%2!=target%2:
n+=1
return n