LeetCode:754. Reach a Number

在这里插入图片描述
又是一道easy的题目。
好像腾讯喜欢拿它做智力题?

一开始的思路是错的。一开始注意到如果连续两次向不同的方向走,可以沿着一个方向走一步。那么就开始朝着target前进,到附近的时候,采用这种方法来走。

然后看了评论区,思路应该这样:
一开始朝着目标走,直到恰好到或者刚刚超过它。这时候观察他与目标的距离:我们的目标是把这个距离变为偶数,因为这样的话就可以把前面的一步改为反方向,就可以恰好落在目标上。如果此时目标距离为偶数,就直接返回就行了;如果为奇数,那么就最多还需要两次就可以变为偶数(取决于下次走的步数是奇数还是偶数):

class Solution {
public:
    int reachNumber(int target) {
        target = abs(target);
        int pos = 0;
        int steps = 1;
        while (pos < target)
            pos += steps++;
        if (pos == target) {
            return steps-1;//steps-1是已经走了的步数
        }
        cout << pos << " " << target << endl;
        if (!((pos - target) & 0x1)) {
            cout << "hi" ;
            return steps - 1;
        }
        else {
            if (steps % 2 == 0)//以后老老实实用%判断奇偶数
                return steps - 1 + 2;
            else
                return steps - 1 + 1;
        }
    }
};

另外,发现(偶数 & 0x1) == 0这样的判断总是不成立,也不知道什么原因。之后用%判断吧

posted @ 2019-09-07 11:13  于老师的父亲王老爷子  阅读(20)  评论(0)    收藏  举报