2020年应届生Vivo初试笔试编程题三道(附思路及解法)。
问题1(难度:** )
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你到达最后一个位置所花费的最小步数。
一开始就在最后一个位置返回0。
不能到达最后一个位置返回-1。
思路:
初始步数为0。
从前往后遍历,直到能找到一个位置i,在该位置能够跳转到末尾。步数+1。
从前往后遍历,直到能找到一个位置j,在该位置能够跳转i。步数+1。
重复上述步骤,直到从初始位置开始跳转。
实现代码
1 | import java.io.BufferedReader; |
改进算法
上述代码时间复杂度为O(n*n),每次遍历出现了大量的冗余工作,每个位置被重复遍历多次,下面做出修改,改进后的算法时间复杂度为O(n)。
改进思路
用列表list维护不同步数能够跳转到能够到达末尾的索引。
首先将末尾索引加入到list中。list下标代表步数,内容代表当前索引。涵义:末尾索引位置的点经过0步到达末尾。
数组从后往前遍历(遍历一次)。列表从前往后遍历,当数组索引处能跳转到列表中存储的索引,在列表后面设置索引。
返回0所在的索引即为从初始位置跳转的最少步数。
异常情况分析:
1、一开始就在末尾:不用遍历,直接返回索引0;
2、不存在路径,list中不含0,list返回不存在元素的索引为-1。
实现代码
1 | import java.io.BufferedReader; |
问题2(难度:** )
m个人,每次数n个数排除,排除的人按次序排列输出。
思路
典型的约瑟夫环问题。
实现代码
1 | import java.io.BufferedReader; |