2019华为笔试 找终点

■题目描述

给定一个正整数数组,最大为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.

注意第一步是小于len/2的,也就是,必然第一步不能一步到位的。
在这里插入图片描述
再举一个例子:
此时走到了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;
}

发布了140 篇原创文章 · 获赞 114 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qinglingLS/article/details/100608339