问题描述:
问题分析:
1.有题目第n步步长为n可联想等差数列求和;
2.由于在水平面上左右走,故左右会发生对称现象如下(且同一步数可到达位置之间存在差值为2的关系):
第一步可到达:1,-1
第二步可到达:3,1,-1
第三步可到达:6, 4, 2, 0, -2, -4, -6
第四步可到达:10, 8, 6, 4, 2, 0 …
第五步可到达:15, 13, 11, 9, 7, 5, 3, 1…
3.分析如上步数:
首先累加确定到达与目标点最近的数值需要几步;
在确定剩余步数需走几步;
4.
以8为例,累加至最近结果10,首先根据同一步数可达位置差值关系,判断当前步数差值是否为偶数(如若为偶数则表示当前步数直接可达);
以7为例,累加至最近结果为10, 不符合同步差值关系,进行下一步判断:当前步数奇偶性(也可以判断目标结果的奇偶性质),4为偶数则表示差值关系在下一步才生效,所以结果加1;
以5为例,累加至最近结果6, 不符合同步差值关系,判断当前步数奇偶性,3为奇数,则同步差值关系在两步后生效,所以结果加2;
完整代码:
int reachNumber(int target)
{
int sum = 0;
target = abs(target);
for (int i = 1; ; i++)
{
sum += i;
if (sum == target)
return i;
else
{
if (sum > target)
{
if (abs(sum - target) % 2 == 0) return i;
else if (i % 2 == 0) return i+1;
else return i+2;
}
}
}
return 1;
}