【问题描述】给一个非负整数数组。假设你最初的位置为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);
}
}