欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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.
2019华为笔试 找终点
再举一个例子:
此时走到了index=2的位置,由于开始的值是7,可以走1<=x<=7步,所以从7开始,可以走1步到9,
从9开始可以走9步到结束位置,所以最少走了两步
2019华为笔试 找终点
再比如下面的情况
2019华为笔试 找终点
和下面的情况:
2019华为笔试 找终点

#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;
}

相关标签: 华为笔试 算法