2019华为笔试 找终点

32 篇文章 0 订阅
24 篇文章 1 订阅

【算法】【华为】2019华为笔试 找终点:给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员最少的步骤数,

https://blog.csdn.net/qinglingLS/article/details/123765889

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

本题答案已经修改,请前往上面网址👆

■题目描述

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

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值