题目
解答
var reachNumber = function(target) {
let curTarget=0;
let step=0;
target=Math.abs(target);
while(curTarget<target){
step++;
curTarget+=step;
}
let dis=curTarget-target;
if(dis%2==0){
return step
}else{
return (dis+step+1)%2?(step+2):(step+1)
}
};
思路
- 正负是一样的,+3和-3需要的最少步数是一样的,可以全部作为正数处理;
- 要想最少步数达到target,就需要不断向目标前进,就是不断的+,即sum=1+2+3+4+…+n;
- 当达到某一步时,刚好sum==target,则步数就是n,大多数情况是sum>target,我们设定dis=sum-target;
- 如果dis为偶数,则我们可以通过反转sum=1+2+…+n中某一项的符号,使target=sum,比如dis=4,则反转4/2=2的符号(将+2变为-2,sum值减小了4),也就是说步数还是n;
- 如果dis为奇数,则可以让dis继续加上n+1或者n+2,使dis变为偶数,然后就跟dis为偶数的情况一致了,也就是步数为n+1或者n+2(取决于什么时候变为偶数);