797. 到达一个数字

797. 到达一个数字

中文English

你站在一个无穷数轴上的 0 位置。在位置目标上有一个目标
在每一个动作中,你可以向左或向右。在第n次移动中(从1开始),你行走n步。
返回到达目的地所需的最小步骤数。

样例

样例1

输入: target = 3
输出: 2
解释:
在第一步,我们从0到1。
在第二步,我们从1到3。

样例2

输入: target = 2
输出: 3
解释:
在第一步,我们从0到1。
在第二个步骤中,我们从1到-1。
在第三步,从-1到2。

注意事项

目标将是一个非零的整数范围[-10^9, 10^9]

class Solution:
    """
    @param target: the destination
    @return: the minimum number of steps
    """
    '''
    大致步骤:
    1.不管目标是正数还是负数,都可以当做正数来计数,步骤数是一样的
    2.涉及到回退的问题,所以得用另一个方法。首先可以将步数相加,直到大于或等于目标数,然后根据相加得到的步数-目标数 ,如果为偶数的话
    那么偶数/2这个步数需要从正数改为负数,既可以实现双倍的反方向步数。如果为奇数的话,那么需要在加上一个奇数为止(可能下一个数是偶数),直到
    相加得到的步数和-目标数为偶数即可,然后根据之前偶数的方法,将偶数/2正数改为负数即可。
    '''
    def reachNumber(self,target):
        target = abs(target)

        count = 0 
        i = 0
        sum = 0
        while  True:
            count += 1
            i += 1
            sum += i
            if sum == target:
                return count
            elif sum> target:
                #判断是否步数之和-目标数是否是奇数还是偶数
                num = sum - target
                if num%2 == 0:
                    #将num/2这个数符号正数改为负数既可以实现,count不变
                    return count
                ##如果为奇数的话,不处理,直到步数和-目标数为偶数的时候为止,就会return
                elif num%2 == 1:
                    continue

 

posted @ 2020-03-23 13:19  风不再来  阅读(209)  评论(0编辑  收藏  举报