笔试坐标轴移动问题

你说的曾经没有我的故事 提交于 2019-12-14 02:38:55
     今天同学笔试遇到一道神奇的题

题目

    给定一个一维坐标轴,从正无穷到负无穷。假如你现在位于坐标O上,你每次可以向左或者向右移动,但有一个条件,那就是第i次移动时,移动的距离必须是i。请计算至少需要移动几次能到达给定的坐标s。
    例:当x是3时,需要两步,第一步右移1,第二步右移2。 当x是4时,需要三步,第一步左移1,第二步右移2,第三步右移3。

思路

    此题主要是一种思想。
    最快的一定是全部左移或右移到达终点例如数字3。若无法全部左移到达终点,则需要某一步或两步往相反方向移动。
    假设坐标s是为非负数(即便是负数也可以将到达相反数的操作全部反向),连续i次右移到达count=i(i+1)2count=\frac{i(i+1)}{2}格。
    本题主要有以下几种情况:

  • s=i(i+1)2|s| = \frac{i(i+1)}{2}         移动i
  • s>i(i+1)2|s| > \frac{i(i+1)}{2}(countx)mod2=0\small(count-|x|)mod2=0 若全向右由移动i次多了偶数格 移动i次(可以通过其中一次左移做出调整)
  • s>i(i+1)2|s| > \frac{i(i+1)}{2}(countx)mod2=0\small(count-|x|)mod2=0(i+1)mod20\small{ (i+1)mod 2 \not= 0 } 若向右全移动i次多了奇数格,且下一次移动奇数格      移动i+1
  • s>i(i+1)2|s| > \frac{i(i+1)}{2}(countx)mod20\small(count-|x|)mod2\not=0(i+1)mod20\small{ (i+1)mod 2 \not= 0 } 若向右全移动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;
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!