题目:获取一个正整数数组的最优跳动方式,要求如下:

1)从数组中间的任意位置开始向右跳,每次跳动的步伐数不能超过该位置对应元素的值

2)在跳动次数最少的情况下计算每次跳动的步伐

以下是实现,采用java实现~

package test;
/***为静态工具类,具体功能见方法 * @author ZOUHENG*/
public class MinStepToArrayEnd {/*** 根据当前位置的跳动范围返回一个最优的位置,该位置使得连续两次跳动可获得最远距离 如果当前位置可以直接跳出数组范围,则最有位置为当前位置* 这里默认传入的参数已经经过验证,满足要求* * @param target*            目标数组* @param currentLocation*            当前位置,对应元素的从左到右的排列位置,第一个元素为1,最后一个元素为数组长度* @return 最优秀位置*/private static int getBestLocation(int[] target, int currentLocation) {// 初始化二连跳的最远位置,可以超出数组范围int maxLocation = currentLocation + target[currentLocation - 1];// 初始化当前位置int bestLocation = currentLocation;// 遍历当前位置覆盖的元素,获得二连跳的最远位置和对应的最优位置for (int i = 0; i <= target[currentLocation - 1]; i++) {int temp = target[(i + currentLocation) - 1] + (i + currentLocation);if (temp >= target.length) {return i + currentLocation;}if (temp > maxLocation) {maxLocation = temp;bestLocation = i + currentLocation;}}return bestLocation;}/*** 根据最佳位置与当前位置计算调动的步伐数量* * @param target* @param currentLocation* @return*/private static int getJumpSteps(int[] target, int currentLocation) {int bestLocation = getBestLocation(target, currentLocation);// 如果最佳位置与当前位置相等,则说明可以直接从当前位置跳到末端,因此直接返回剩下的步伐if (bestLocation == currentLocation) {return target.length - currentLocation;}// 如果不等,则返回最佳位置与当前位置的步伐差return bestLocation - currentLocation;}/*** 获取一个正整数数组的最优跳动方式,要求如下:* 从数组中间的任意位置开始向右跳,每次跳动的步伐数不能超过该位置对应元素的值* 在跳动次数最少的情况下计算每次跳动的步伐* * @param target* @param currentLocation* @return* @throws Exception* */public static String getStepsResult(int[] target, int currentLocation) throws Exception {if (null == target || target.length == 0)throw new CheckParamException("数组参数为空或未初始化,请检查······");for (int i : target)if (i < 1)throw new CheckParamException("数组成员包含小于非正整数");if (currentLocation < 1 || currentLocation > target.length)throw new CheckParamException("开始位置参数不正确,必须大于等于1并且小于等于" + target.length);String result = "";int jumpSteps = getJumpSteps(target, currentLocation);while (jumpSteps + currentLocation != target.length) {result += jumpSteps + ",";currentLocation = getBestLocation(target, currentLocation);jumpSteps = getJumpSteps(target, currentLocation);}return result + jumpSteps;}/*** 测试*/public static void main(String[] args) throws Exception {int a[] = { 4, 1, 5, 1, 3, 2, 1, 3, 1, 2, 3, 1, 1 };System.out.println(getStepsResult(a, 1));}/*** 自定义参数检查异常* * @author ZOUHENG*/private static class CheckParamException extends Exception {private static final long serialVersionUID = -5470930382435803070L;public CheckParamException(String message) {super(message);}}
}

转载于:https://www.cnblogs.com/zouheng/p/6702159.html

阿里笔试的一道算法题相关推荐

  1. 搜狗2020秋招笔试的一道算法题

    搜狗2020秋招的一道算法题 有A,B,C三种样品,凑齐三个样品各一个就可以领取一个奖品.任意两个样品可兑换另一种样品,如AA可兑换一个B或一个C,AB可兑换一个C.输入ABC,问最多可以领取多少奖品 ...

  2. 一看“左程云:200道算法与数据结构”,二刷“阿里云:70+算法题、30种大厂笔试高频知识点”,3月过去终于挺进我梦中的字节!

    不管是学生还是已经工作的人,我想彼此都有一个相同的梦想:进大厂! 眼看着2020年还有个三十来天就要完美收尾了,那么如何才能在未来三个月弯道超车赶上"金三银四的春招",进入梦寐以求 ...

  3. 一天一道算法题--5.30---递归

    感谢微信平台:  一天一道算法题 --------每天多一点进步--------- 今天 休假 这题 也很水 能发现 规律就好 明天 再也不能这样了 forgive me ---------- 转载于 ...

  4. 一天一道算法题--6.15--卡特兰数

    感谢微信平台---一天一道算法题---每天多一点进步- problem: 12个高矮不同的人 排成两排 每排必须是从矮到高排列 而且第二行比对应的第一排的人高 问排列方式有多少种? analyse: ...

  5. 一道算法题跟大家分享

    无意中看到一道算法题,拿出我的解法与大家分享. 题目:输出1,2,3,4四个数字能组成的互不相同且无重复的三位数并统计满足条件的三位数个数 大家先想想,再看答案吧. View Code 1 /// & ...

  6. 每天一道算法题系列十七之电话号码的字母组合

    每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-numb ...

  7. 2016恒生电子秋招笔试两道算法题

    2016恒生电子笔试两道算法题 1.求出1到100之间所有素数,要求时间复杂度最优. 我的最优解决方案是吧素数一个个放入一个素数数组里面(初始吧2放进去),后面的数只要判断是否能够整除这个素数数组里面 ...

  8. 每天一道算法题系列十二之整数转罗马数字

    每天一道算法题系列: 来源:力扣(LeetCode) 本题链接:https://leetcode-cn.com/problems/integer-to-roman/ 来源是力扣,大家喜欢可以去力扣中文 ...

  9. 截止目前为止,我遇到的最难的一道算法题:计算相邻两个数的最大差值

    hello,今天给大家带来一道算法题.这道算法题,是我目前为止,见过最难的一道题.那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值. 要求时间复杂度O( ...

最新文章

  1. 正则表达式模式修正符
  2. 当当大促的额外优惠来啦!160 买 400的书!搓搓搓~
  3. Android 从清单配置文件元数据中获取值
  4. 第八章方差分析以及线性回归(2)
  5. SpringCloud学习之路(一)-简单Demo
  6. Eclipse集成ijkplayer并实现本地和网络视频播放等
  7. 美国ADP就业数据是什么?与非农有何关系
  8. 实际应用中installshield的事件处理
  9. Just for fun--Linus
  10. No.025:Reverse Nodes in k-Group
  11. 华为机试4.27:购买水果最便宜的方案
  12. 免费的pdf编辑软件
  13. Linux内核数据结构之 radix tree
  14. python mac 启动台 图标 跳跃_详解macOS的Mac电脑上使用“启动台”(Launchpad)
  15. cpu计算速度排行榜_中央处理器cpu性能排名
  16. input:-webkit-autofill
  17. enc易能变频_ENC易能变频器专修公司
  18. 8的倍数——题解(容斥原理)
  19. centos 解除链接_KeyShot 9.2 新功能介绍!(附下载链接)
  20. python模拟抽奖

热门文章

  1. 51CTO博客——架起我与读者沟通、见面的桥梁[博友话题]
  2. 浅谈 js 数字格式类型
  3. 三层交换的测试1:级联的傻HUB
  4. redis key命名规范_公司内部 Redis 使用规范
  5. Android的内容观察者
  6. ssh整合步骤之二(架构设计)
  7. android中json解析及使用 (下)
  8. 怎样去构建一个优质的Docker容器镜像
  9. 区块链软件:区块链的迅猛发展
  10. 使用webuploader组件实现大文件分片上传,断点续传