LeetCode754(Reach a number) Java 代码.

1.题目描述:
给定一个目标整数(正、负均可)。问到达目标整数所需要的最少移动次数是多少?
移动规则:第 i次移动可以移动i 步,每一步可以向左或者向右移动(刚开始这个英文没看仔细,结果纠结半天)。

2.
例子1:
输入: target = 3
输出: 2
解释:
第一步0到1.
第二步2到3.

例子2:
输入: 目标 = 2
输出: 3
解释:
第一步0到1.
第二步2到-1.
第三步-1到2.

3.思路与代码:
(1)由于可以向左向右移动因此目标不管是正数或者负数结果都是一样的。
(2)记录所有的移动步数总和sum。
(3)如果 sum正好等于target正好返回。
(4)如果sum比目标 target大,那么计算 sum与 target的差值是奇数还是偶数。因为可以向左或者向右移动,如果是奇数的话,右移左移无法回到 target,但是偶数可以。
(5)如果 sum-target为奇数,那么再移动奇数步可以正好得到偶数步。

代码:

Class Solution{
    public int reachNumber(int target){
        int posTarget = Math.abs(target);
        int sum = 0;
        int steps = 0;
        while(sum < posTarget){
            steps++;
            sum += steps;
            if(sum == posTarget) return steps;
            if(sum > posTarget){
                int dif = sum - posTarget;
                if(dif % 2 == 0) return steps;

                steps++;
                if(steps % 2 != 0) return steps;
                else return ++steps;
            }
        }
        return steps;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值