【问题描述】输入一个数组(数字>=0)-1结束,你最初处于数组的第一个位置,你所处于的位置的数字表示你能跳几格,
判断你最终是否能正好跳到数组的最后一个位置,能就输出Yes不能输出No
【样例输入】1 3 1 2 3 1 2 2 1 4 -1
【样例输出】Yes
【样例输入】2 3 2 6 0 3 -1
【样例输出】No
【样例说明】递归递归
【思路分析】出题人强调使用递归,但我实在是没写过递归,又赶时间上交。就没用递归
先定义了一个长度为50的数组data,保证够他输入数据。
if判断接受数据,count计数数组元素个数。
定义第二个数组data1,长度为count,元素为data中的元素。
接下来就算是整个代码的核心了,也是题目最难的部分(用递归可能很简单)。
for循环100次,实际上肯定用不了。
A为他每次跳完后所在位置上的值,如果这些值加起来刚好等于数组长度-1,那就说明最后刚好跳到数组最后一个元素上,输出Yes
【代码如下】(原创并已测试)
public static void main(String[] args) {
int count = 0;
int[] data = new int[50];
for (int i = 0; i < data.length; i++) {
count++;
int n = sc.nextInt();
if (n != -1) {
data[i] = n;
}
if (n == -1) {
break;
}
}
int[] data1 = new int[count - 1];
for (int i = 0; i < count - 1; i++) {
data1[i] = data[i];
}
int a = 0;
int A = 0;//数组元素的值
for (int i = 0; i < 100; i++) {
A = A + a + 0;
if (A > data1.length) {//如果他直接跳出了数组,输出No。所以这个要写到前面,判断一下是否跳出了数组,要不然程序直接就会崩溃。如果没有,再执行a = data1[A]
System.out.println("No");
break;
}
a = data1[A];//下一步应该跳到第几个位置
if (a == 0 && A < data1.length - 1) {//如果刚好跳到一个为0的元素上,且不是最后一个元素,此时再如何循环也不会往下跳了,直接输出No
System.out.println("No");
break;
}
if (A == data1.length - 1) {//这是刚好跳到最后一个位置
System.out.println("Yes");
break;
}
}
int count = 0;
int[] data = new int[50];
for (int i = 0; i < data.length; i++) {
count++;
int n = sc.nextInt();
if (n != -1) {
data[i] = n;
}
if (n == -1) {
break;
}
}
int[] data1 = new int[count - 1];
for (int i = 0; i < count - 1; i++) {
data1[i] = data[i];
}
int a = 0;
int A = 0;//数组元素的值
for (int i = 0; i < 100; i++) {
A = A + a + 0;
if (A > data1.length) {//如果他直接跳出了数组,输出No。所以这个要写到前面,判断一下是否跳出了数组,要不然程序直接就会崩溃。如果没有,再执行a = data1[A]
System.out.println("No");
break;
}
a = data1[A];//下一步应该跳到第几个位置
if (a == 0 && A < data1.length - 1) {//如果刚好跳到一个为0的元素上,且不是最后一个元素,此时再如何循环也不会往下跳了,直接输出No
System.out.println("No");
break;
}
if (A == data1.length - 1) {//这是刚好跳到最后一个位置
System.out.println("Yes");
break;
}
}
}
这是for循环加一个一个的if语句判断得出的。如果哪位大佬会递归,或者有更简单的方法,欢迎指教,欢迎指教!