JAVA程序设计思想——跳跃最大长度

【问题描述】给一个非负整数数组。假设你最初的位置为0,数组中每一个元 素的值代表你能跳跃最大的长度,判断是否能达到数组的最后一个位置
【输入形式】第一行数组长度, 第二行输入一个非负整数数组
【输出形式】布尔类型的值
【样例输入】 5 1 2 3 1 4
【样例输出】 true

题目解读
题目的意思是给出一个数组,数组中的每个值表示在当前位置你可以跳跃的最大长度,也就是说你跳跃的时候可以直接跳到这个最大长度,也可以一步步跳,但是最终的目的是要跳出这个数组的最后一个位置

例子
如数组{1,2,3,1,4}
设置maxd=0代表整个数组我可以跳到的最大位置,nowd表示我在当前位置可以跳的最大位置
当i=0的时候,a[i]=1,所以nowd=0+1=1,此时nowd>maxd,更新maxd=1;
当i=1的时候,a[i]=2,所以nowd=1+2=3,此时nowd>maxd,更新maxd=3;
当i=2的时候,a[i]=3,所以nowd=2+3=5,此时nowd>maxd,更新maxd=5;
此时maxd大于数组最后一个位置的下标,所以此时已经可以判断能跳出数组,可以结束循环
最开始的错误尝试

package com.ljm.demo.lx3;

import java.util.Scanner;

public class tyzdcd {
    static public void main(String args[]){
        Scanner s=new Scanner(System.in);
        int n=s.nextInt();
        int []a=new int[n];
        for(int i=0;i<n;i++)
            a[i]=s.nextInt();
        int maxd=0;
        boolean result=false;
        for(int i=0;i<n;i++){
            int nowd=a[i]+i;
            maxd=Math.max(maxd,nowd)if(maxd>=n-1){
                result=true;
                break;
            }
        }
        System.out.println(result);
    }
}

注意for循环里的判断,这里错误的原因就是忽略了这样的情况A = [3,2,1,0,4],返回 false,如果只是通过maxd>=n-1判断的话,忽略了如果处理一个位置后maxd还是等于这个位置的值而且这个位置不是数组的最后一个位置,说明他断在了这里无法跳到下一个,即时下一个位置的nowd>=n-1也不可以,也就是不能跳出数组。
更改后正确的代码

package com.ljm.demo.lx3;

import java.util.Scanner;

public class tyzdcd {
    static public void main(String args[]){
        Scanner s=new Scanner(System.in);
        int n=s.nextInt();
        int []a=new int[n];
        for(int i=0;i<n;i++)
            a[i]=s.nextInt();
        int maxd=0;
        boolean result=false;
        for(int i=0;i<n;i++){
            int dn=a[i]+i;
            maxd=Math.max(maxd,dn);
            if(maxd==i&&i!=n-1) break;
            if(maxd>=n-1){
                result=true;
                break;
            }
        }
        System.out.println(result);
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值