今天同学笔试遇到一道神奇的题
题目
给定一个一维坐标轴,从正无穷到负无穷。假如你现在位于坐标O上,你每次可以向左或者向右移动,但有一个条件,那就是第i次移动时,移动的距离必须是i。请计算至少需要移动几次能到达给定的坐标s。
例:当x是3时,需要两步,第一步右移1,第二步右移2。 当x是4时,需要三步,第一步左移1,第二步右移2,第三步右移3。
思路
此题主要是一种思想。
最快的一定是全部左移或右移到达终点例如数字3。若无法全部左移到达终点,则需要某一步或两步往相反方向移动。
假设坐标s是为非负数(即便是负数也可以将到达相反数的操作全部反向),连续i次右移到达格。
本题主要有以下几种情况:
- 移动i次
- 且 若全向右由移动i次多了偶数格 移动i次(可以通过其中一次左移做出调整)
- 且且 若向右全移动i次多了奇数格,且下一次移动奇数格 移动i+1次
- 且且 若向右全移动i次多了奇数格,且下一次移动偶数格 移动i+2次
代码
java代码
public int nthReach(int x) {
if(x==0) return 0;
int i = 0, count = 0;
x = Math.abs(x);
while (count < x) {
count += ++i;
}
System.out.println(i);
//若同向移动i次多了偶数格或移动i次刚好到x
if((count-x)%2==0) return i;
//若同向移动i次多了奇数格,但下一次为奇数
if((i+1)%2==1) return i+1;
//若同向移动i次多了奇数格,但下一次为偶数
return i+2;
}
c++代码
int nthReach(int x){
if(!x) return 0;
int i = 0, count = 0;
x = abs(x);
while (count < x) {
count += ++i;
}
if(!((count-x)%2)) return i;
if((i+1)%2) return i+1;
return i+2;
}
来源:CSDN
作者:苦战前线的程序猿
链接:https://blog.csdn.net/daiqi1997/article/details/103531881