■题目描述
给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员最少的步骤数,
第一步必须从第一元素开始,1<=步长<len/2, 第二步开始以所在成员的数字走相应的步数,如果目标不可达返回-1,只输出最少的步骤数量

  1. 思路1:从前往后进行遍历,第一步走1步,求解;第一步走2步,求解,第一步走…… 走(len/2)步,分别求解,如果可以达到终点,则记录步数,如果步数足够小,则保存。这样复杂度是O( n 2 n^2 n2)。
  2. 思路2:从后往前遍历,指针记录距离尾部距离,例如:nToTail=0,指针在9位置;nTotail=1,指针在3位置,由于3!=nToTail而且大于nToTail,不计算,指针继续前移;同样,指针一直移动,直到nToTail=6此时data[len-1-6]=6,保存此时的步长并继续向前移动,直到找到表头为止;此时,指针移动到nToTail=9,data[len-1-9]=9,所以更新最大步长为9;继续找到表头,无符合的数据了
  3. 从刚才找到的最大步长开始继续往前找,令指针指向data[len-1-9]位置,更新距离为0。此时,len-1-9已经小于len/2所以可以一步到位;否则应该从9开始,继续往前找,直到找到一个步长,可以从后往前越过len/2的位置。

可以看到,思路2的耗时明显很少,采用思路2进行编码

PS:会不会有从前往后走能走通,但是从后往前走走不通的情况呢:
考虑到类似:1,3,1,2,120,1,0的输入,从后往前走,会遇到120,此时会走不通,但是走到2的时候,由于走两步到倒数第二个1,所以120并不影响。(这个证明并不严谨,大概是这个意思)
代码:

#include <iostream>using namespace std;
/**********************************************/
// 给定一个正整数数组,最大为100个成员,从第一个成员开始,
// 走到数组最后一个成员最少的步骤数,
// 第一步必须从第一元素开始,1 <= 步长 < len / 2,
// 第二步开始以所在成员的数字走相应的步数,如果目标不可达返回 - 1,
// 只输出最少的步骤数量
int FindEnd(int* numbers, int length) {if (numbers == nullptr || length <= 1){return -1;//不存在,输出-1}int nIndex = length - 1; // 尾部指针int nToTailDist = 0; // 指针距离尾部距离int nMaxStep = 0; // 最大距离int nStep = 0; // 当前走的步数while (true){if (nToTailDist == numbers[nIndex] && nMaxStep < nToTailDist){// 找到可达步长nMaxStep = nToTailDist;}nIndex--; // 移动指针nToTailDist++; if (nIndex < 0){if (nMaxStep ==0){    // 如果该回合没有找到一个最大步数,说明卡住了,没有可达步数return -1;}nStep++;nIndex = length - 1 - nMaxStep;if (nIndex <= length / 2){if (nIndex>0){nStep++;return nStep;}else {return nStep;}}nToTailDist = 0;nMaxStep = 0;}}return -1;
}void Test(int v1,int v2,const char*name) {if (v1 == v2) {cout << name << ": pass" << endl;}else {cout<<name << ": FAIL!!" << " should be " << v2 << endl;}
}void Test_FindEnd() {// 标准测试用例:走2步到9,从9到尾部结束// 答案:2int test1[12] = { 7,5,9,4,2,6,8,3,5,4,3,9 };Test(FindEnd(test1, 12), 2, "test1");//测试用例2:正好从第一步9步(len/2)走到9,然后到终点// 答案:2int test2[19] = { 1,2,3,4,5,2,5,6,7,9,4,2,6,8,3,5,4,3,9 };Test(FindEnd(test2, 19), 2, "test2");//测试用例3:一步就可以结束// 答案:1int test3[10] = { 9,4,2,6,8,3,5,4,3,9 };Test(FindEnd(test3, 10), 1, "test3");//测试用例4:没有路线可以到尾部1// 答案:-1int test4[4] = { 9,4,10,12};Test(FindEnd(test4, 4), -1, "test4");//测试用例5:没有路线可以到尾部2//答案:-1int test5[12] = { 1,2,4,2,1,1,100,120,1,2,3,4 };Test(FindEnd(test5, 12), -1, "test5");//测试用例6:异常输入// 答案:-1int *test6 = nullptr;Test(FindEnd(test6, 1), -1, "test6");//测试用例7:最短步数:从index=3走到4,再走到1,只需要3步// 答案:3int test7[10] = {3,1,1,1,4,1,1,1,1,1};Test(FindEnd(test7, 10), 3, "test7");//测试用例8:// 答案:1int test8[2] = { 1,1 };Test(FindEnd(test8, 2), 1, "test8");//测试用例9:异常测试// 答案:-1int test9[1] = { 1 };Test(FindEnd(test9, 1), -1, "test9");// 考虑输入0的情况int test10[7] = { 1,3,1,2,120,1,0 };Test(FindEnd(test7, 7), -1, "testA");
}int main()
{Test_FindEnd();
}

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

  1. 2019华为笔试 找终点

    [算法][华为]2019华为笔试 找终点:给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员最少的步骤数, https://blog.csdn.net/qinglingLS ...

  2. 【偷鸡系列】华为OD机试 :找终点

    1.题目大意 给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员最少的步骤数.第一步必须从第一元素开始,1<=步长<len/2, 第二步开始以所在成员的数字走相 ...

  3. 华为机试练习(九)找终点

    题目描述 给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员最少的步骤数.第一步必须从第一元素开始,1<=步长<len/2, 第二步开始以所在成员的数字走相应的 ...

  4. 华为odjava机试题_华为OD机试 :找终点

    题目大意 给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员最少的步骤数.第一步必须从第一元素开始,1<=步长 样例输入 7 5 9 4 2 6 8 3 5 4 3 ...

  5. 华为2019秋招面试问答题!(附带笔试参考题)

    前言: 采菊东篱下,悠然见南山",菊花厂的名气就不多介绍了! 今天为大家带来的内容是华为2019秋招面试问答题!(附带笔试参考题)具有不错的参考意义,希望能够帮助到大家! 内容如下: 总共分 ...

  6. 华为2019算法大赛CTR预估数据探索

    华为2019算法大赛CTR预估数据探索 训练集 时间信息 siteId(媒体Id) slotId(广告位Id) netType(网络连接类型) id类信息 测试集 媒体id 网络型号 测试集与训练集分 ...

  7. 【2019华为笔试】召唤师的技能——圆排列,翻转和项链排列

    题目描述: dota游戏里面,召唤师可以控制冰雷火三种元素,并通过元素组合产生新的技能.现在我们修改了张新的地图, 地图中他能够控制n种元素, 并且将m个元素围成一个圈组成一 个新技能(这m个元素通过 ...

  8. 最新九月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试三十题

    最新九月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试三十题 引言 自发表上一篇文章至今(事实上,上篇文章更新了近3个月之久),blog已经停了3个多月,而在那之前,自开博以来的21个月每月都不曾断过. ...

  9. 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题(10.29)

    文章出处:http://blog.csdn.net/v_july_v/article/details/7974418 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题 (参与算法&面 ...

最新文章

  1. java udp乱码_【Java】Java UDP 套接字编程乱码问题
  2. 使用Kubespray部署Kubernetes集群
  3. python之路day05--字典的增删改查,嵌套
  4. SQl 根据某列去重 partition by
  5. C#中将list进行二进制序列化并保存数据到文件
  6. WinForm编程数据视图之DataGridView浅析
  7. [机器学习] Boosting算法1 --- AdaBoost
  8. 定量遥感:计算地方时和太阳高度角(C++代码)
  9. 美团技术:到店结算平台实践(胶片)
  10. 中国内窥镜仪器固定臂市场趋势报告、技术动态创新及市场预测
  11. BZOJ-4008: [HNOI2015]亚瑟王 (概率期望DP)
  12. 以太坊 ERC EIP是什么
  13. Nginx的configure各项中文说明
  14. 制作云计算平台的虚拟机镜像
  15. 诺顿5月17日病毒库误报,导致系统文件被删除
  16. 特洛伊木马与计算机病毒有什么区别,特洛伊木马Vs病毒Vs蠕虫, 有什么区别?...
  17. 打开 CMD 的方式+常用的Dos命令
  18. 小米盒子运行linux,小米盒子刷机成砖的解救措施攻略详解
  19. windows服务部署
  20. Java怎样存钱利息最大_C_怎样存钱利最大

热门文章

  1. 盘点低延时网络架构中使用的那些黑科技!
  2. 美发集团怎样运用虚拟机器人增加数据收集范围
  3. Svchost.exe服务
  4. HTML5+CSS3学习准备
  5. redis配置文件 谷歌翻译版本
  6. Android 使用百度鹰眼实现运动轨迹功能
  7. Web-Crawler(爬虫基础)
  8. 解决VirtualBox的Error In supR3HardenedWinReSpawn , Error relauching VirtualBox VM process:5 的问题
  9. 史玉柱:我是一个著名的失败者
  10. 太牛了!淘宝十年架构变迁