算法:跳石板
来源:互联网 发布:公安网络备案 编辑:程序博客网 时间:2024/04/29 17:09
这题是2017年,网易秋招的一道编程题,算法思想为动态规划。。其实回溯也能做就是复杂度太高
没有官方难度定义。。我觉得难度应该在medium
小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3.......
这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。
例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板
import java.util.ArrayList;import java.util.Scanner;/** * Created by zyl on 2017/3/12. */public class Main { //辅助算法,获取n的所有因数,不包含本身与1 public static ArrayList<Integer> getAppNums(int n) { ArrayList<Integer> list = new ArrayList<Integer>(); for (int i = 2; i <= Math.sqrt(n); i++) { if (n % i == 0) { list.add(i); if (n / i != i) { list.add(n / i); } } } return list; } public static void main(String args[]){ Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int N = in.nextInt(); int M = in.nextInt(); int[] nums=new int[M+1]; if(N>M){ System.out.print(-1); }else{ nums[N]=1; //这是代码的关键,确定表nums,公式为 若nums[i+tempj]=Math.min(nums[i]+1,nums[i+tempj]); for(int i=N;i<=M;i++){ if(nums[i]>0){ ArrayList<Integer> list=getAppNums(i); for(int j=0;j<list.size();j++){ int tempj=list.get(j); if(i+tempj>M)continue; if(nums[i+tempj]>0){ nums[i+tempj]=Math.min(nums[i]+1,nums[i+tempj]); }else{ nums[i+tempj]=nums[i]+1; } } } } if(nums[M]>0){ System.out.print(nums[M]-1); }else{ System.out.print(-1); } } } }}
0 0
- 算法:跳石板
- 【算法题】跳石板
- 跳石板
- 跳石板
- 跳石板
- 跳石板
- 跳石板
- 跳石板 札记
- 网易---跳石板
- [编程题] 跳石板
- [编程题] 跳石板
- [编程题]跳石板
- 【BFS】跳石板
- [编程题] 跳石板
- 跳石板-动态规划
- 跳石板---动态规划
- 跳石板-动态规划
- [编程题] 跳石板
- Tensorflow语法学习笔记(一):变量:创建、初始化、保存和加载
- ESP8266连接 TCP
- 观察者模式
- activeMQ与spring+springMVC+activeMQ配置
- ffplay中关于播放卡顿问题分析
- 算法:跳石板
- 并查集算法
- 链表实现
- docker中的ROS容器对远端turtlebot的行为控制
- 千字文
- 复习之旅之mybatis逆向工程
- 设计模式——观察者模式
- c# Datatable释放资源
- JS利用正则配合replace替换指定字符