牛客题解 | 数组移动跳跃
题目
题目难度:简单难度
知识点:字符串、数组
题解
首先考虑:将输入的字符串进行拆分转化为数组(该过程见代码)。
其次:怎样判断是否越界,两种方法:
方法(一)
构造一个辅助数组,初始值为0,已经访问过的下标将其值设置为1。跳转到某个下标处是,判断辅助数组其下标处的值是否为1,若为1,则不能跳出,输出flase。对于ture的情况,判断条件为,得到的下标值小于0或者大于等于数组长度。
#include <iostream>
#define Maxn 1000
using namespace std;
int a[Maxn] ;
int b[Maxn] ;//辅助数组
int main()
{
int i=0,l;
int num;
//将字符串转化为数组
while(getchar()!=']')
{
cin>>num;
a[i++]=num;
}
l=i;
//初始化辅助数组
for(i=0;i<l;i++) b[i]="0;" int flat="0;" 是否重复访问某下标的标志向量,为1时存在重复访问,为0没有重复访问 退出循环的条件为访问下标小于0或者大于等于数组长度 i="0;" while(i>=0 && i<l){ 若该下标已经访问过, 修改标志变量,退出循环 if(b[i]="=1){" flat="1;" break; } b[i]="1;" i+="a[i];" 如果标志变量为1,输出flase否者输出ture if(flat="=1)" cout<<"false"; else cout<<"true"; ``` ##方法(二) 不使用辅助数组。下标不重复出现且其越界,那么它访问的下标的次数一定是少于数组长度。因此设置循环,循环次数为数组长度,若得到下一次访问的下标值小于0或者大于等于数组长度,退出循环输出ture,若循环正常结束输出flase(通过一个标志变量判断是否提前退出循环)。 #include <iostream>
#define Maxn 1000
using namespace std;
int a[Maxn] ;
int main()
{
int i=0,l;
int num;
//将字符串转化为数组
while(getchar()!=']')
{
cin>>num;
a[i++]=num;
}
l=i;
int flat=1; //标志向量,当为0是越界,正常执行完循环为1,访问次数大于数组长度,输出false
//退出循环的条件为访问下标小于0或者大于等于数组长度
i=0;
for(int j=1;j<=l;j++){
i+=a[i];
if(i<0||i>=l) {
flat=0;
break;
}
}
//如果标志变量为1,输出flase否者输出ture
if(flat==1) cout<<"false"<</l){></l;i++)></iostream>

浙公网安备 33010602011771号