2019华为笔试 找终点
程序员文章站
2024-03-15 16:14:48
...
■题目描述
给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员最少的步骤数,
第一步必须从第一元素开始,1<=步长<len/2, 第二步开始以所在成员的数字走相应的步数,如果目标不可达返回-1,只输出最少的步骤数量
这个题我理解错了,以为每一步都可以走 0<x<步长数字,写的代码通过率40%,
哎,我好菜啊。。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int group[100]= {0};
int num=0;
int max=0;
while(scanf("%d",&group[num])!=EOF)
{
if(max<group[num])
{
max=group[num];
}
//printf("%d ",group[num]);
num+=1;
}
//printf("max:%d\n",max);
num=num-1;
int time=0;
int i=0;
int flag=0;
int maxstep=0;
int maxindex=0;
while(num>=0)
{
maxstep=0;
maxindex=0;
for(i=0; i<=max&&num-i>=0; i++)
{
//printf("当前为%d,往回走了%d步,maxstep:%d,maxindex:%d,num:%d\n",group[num-i],time,maxstep,maxindex,num);
if(group[num-i]>=i)
{
maxindex=i;
maxstep=group[num-i];
}
}
//if(maxstep==0&&maxindex==0&&i==max){
// flag=1;
//}else{
time++;//往前走
//}
num=num-maxindex-1;
if(group[num+1]==0){
flag=1;
}
}
if(group[0]>=maxindex&&flag!=1)
{
printf("%d\n",time);
}
else
{
printf("-1\n");
}
return 0;
}
按照题意修正版本:
思路:
从最后一个数字往回走,比如:
1 5 1 9 4 2 6 8 3 5 4 3 9
则倒着走了九步,也就是从正着的9到达倒着的9的位置,中间越过了9个数字,
而5不是第一个数字,且按照如下步骤:从index=2的1的地方,没有办法再回到原本的开始位置了,
所以不能到达,结果是-1.
再举一个例子:
此时走到了index=2的位置,由于开始的值是7,可以走1<=x<=7步,所以从7开始,可以走1步到9,
从9开始可以走9步到结束位置,所以最少走了两步
再比如下面的情况
和下面的情况:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int group[100]= {0};
int num=0;
int max=0;
while(scanf("%d",&group[num])!=EOF)
{
if(max<group[num])
{
max=group[num];
}
printf("%d ",group[num]);
num+=1;
}
printf("max:%d\n",max);
num=num;
int length=(num+1)/2;
int time=0;
int i=0;
int flag=0;
int maxstep=0;
int maxindex=0;
while(num>=0)
{
maxstep=0;
maxindex=0;
for(i=1; i<=max+1&&num-i>=0; i++)
{
if(group[num-i]==i-1)
{
maxindex=i;
maxstep=group[num-i];
}
printf("当前为%d,i:%d,往回走了%d步,maxstep:%d,maxindex:%d,num:%d\n",
group[num-i],i,time,maxstep,maxindex,num);
}
if(i==1){
break;
}
time++;//往前走
num=num-maxindex;
printf("往前走一步,走到了%d,index:%d,走了%d步\n",group[num],num,maxindex);
if((group[num]==0||maxindex==0)&&num>=group[0])
{
flag=1;
break;
}
else if(maxindex==0)
{
break;
}
}
if((num==0||group[0]>=num)&&flag!=1)
{
printf("%d\n",time);
}
else
{
printf("-1\n");
}
return 0;
}
上一篇: Java 展示 杨辉三角
下一篇: 笔试题细节整理