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这样的判断总是不成立,也不知道什么原因。之后用%判断吧
浙公网安备 33010602011771号