列表

详情


OR109. 数组移动跳跃

描述

给定一个非空的整数数组,从数组第一个元素(下标为0的元素)开始遍历进行移动,下一次向后或向前移动 该元素的值 的位数(值为正数向后移动,值为负数向前移动,值为零不移动),依次类推进行移动,若某次移动数组出现越界,则说明数组可以跳出,返回true;不能跳出则返回false;(加分项:也可考虑不增加使用其他集合数组辅助完成算法)
例1:
输入数组a[5] = [1,2,3,2,5];从第一个元素开始a[0]=1,下次向后移动1位到第二个元素a[1]=2,再次向后移动2位到第四个元素a[3],因为下次向后移动2位(a[3]=2)后,向后数组越界,即跳出数组,输出true;
例2:
输入数组a[2] = [1,-3];从第一个元素开始a[0]=1,下次移动1位到第二个元素a[1]=-3,再次向前移动3位后,向前数组越界,即跳出数组,输出true;


输入描述

一个非空的整数数组(至少有一个元素,可正可负)

输出描述

按规则移动后是否能跳出数组

示例1

输入:

[1]

输出:

true

示例2

输入:

[2,1,3,5]

输出:

true

示例3

输入:

[2,1,-3]

输出:

true

示例4

输入:

[1,1,1,2,-1,1,-3]

输出:

false

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 360KB, 提交时间: 2020-05-20

#include<stdio.h>
   
int main()
{
    char c;
    int i,j,n,a[20],*pb,res=0;
    i=0;
    while ((c=getchar())!=']')
    {
        scanf("%d",a+i);
        i++;
    }
    n=i;
    j=0;
    for(i=0;i<n;i++){
        j=j+a[j];
        if(j<0||j>=n){
            res=1;
            break;
        }
    }
    if(res)
        printf("true");
    else
    {
        printf("false");
    }
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 360KB, 提交时间: 2020-05-11

#include<stdio.h>
  
int main()
{
    char c;
    int i,j,n,a[20],*pb,res=0;
    i=0;
    while ((c=getchar())!=']')
    {
        scanf("%d",a+i);
        i++;
    }
    n=i;
    j=0;
    for(i=0;i<n;i++){
        j=j+a[j];
        if(j<0||j>=n){
            res=1;
            break;
        }
    }
    if(res)
        printf("true");
    else
    {
        printf("false");
    }
    return 0;
}

上一题