题解 | #魔法数字#


题目链接

魔法数字


题目描述

牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的。
操作共有三种,如下:

  1. 在当前数字的基础上加一,如:4转化为5

  2. 在当前数字的基础上减一,如:4转化为3

  3. 将当前数字变成它的平方,如:4转化为16

返回最少需要的操作数。

示例1

输入

3,10

输出

2

示例2

输入

1,10

输出

4

示例3

输入

24,500

输出

19

解题思路

本题实质上是简单递归,但剪枝过程比较复杂,如果不剪枝,一定会超时。

单单对n去判定效率是不够的(毕竟爱情是双向奔赴),所以我们要让m也靠近n。

let m1 = Math.floor(Math.sqrt(m));
let m2 = m1 + 1;
let sub1 = m > n ? m - n : n - m;
let sub2 = m1 > n ? m1 - n : n - m1;
sub2 += m - m1 * m1;
let sub3 = m2 > n ? m2 - n : n - m2;
sub3 += m2 * m2 - m;

这一段的意思,是寻找m的算术平方根,其中m1*m1<mm2*m2>m,且m1+1=m2。分别对m,m1,m2进行判断,看n能更快地“奔赴”哪一方。

当然,用m1和m2是有代价的——那就是|m-m1^2|(或|m-m2^2|),就是它们的平方与m之间的差距。

这一思想还是很好理解的,将测试数据代入并思考即可理解。

于是,n只会+1或者-1,而m只会取平方根,取平方根取整后再平方的值与m的差距为n的步长。


/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param n int整型 表示牛牛的数字* @param m int整型 表示牛妹的数字* @return int整型*/
function solve( n ,  m ) {// write code hereif (m <= n)return n - m;else {let min = m - n;let find = (n, m, step) => {if (step > min)return;if (n == m) {if (step < min) {min = step;}return;}let m1 = Math.floor(Math.sqrt(m));let m2 = m1 + 1;let sub1 = m > n ? m - n : n - m;let sub2 = m1 > n ? m1 - n : n - m1;sub2 += m - m1 * m1;let sub3 = m2 > n ? m2 - n : n - m2;sub3 += m2 * m2 - m;if (sub2 < sub1 && sub2 < sub3 && n != 1) {find(n, m1, step + 1 + m - m1 * m1);} else if (sub3 < sub1 && sub3 <= sub2 && n != 1) {find(n, m2, step + 1 + m2 * m2 - m);} else {if (n < m)find(n + 1, m, step + 1);elsefind(n - 1, m, step + 1);}}find(n, m, 0);return min;}
}
module.exports = {solve : solve
};

[JS]题解 | #魔法数字#相关推荐

  1. [ASDFZ-NOIP2016模拟]魔法数字

    魔法数字 (magic.cpp/c/pas) 题目描述 在数论领域中, 人们研究的基础莫过于数字的整除关系. 一般情况下, 我 们说整除总在两个数字间进行,例如 a | b(a 能整除 b) 表示 b ...

  2. js只能输入数字,小数点(整理)

    <html> <head> <meta http-equiv="content-Type" content="text/html;chars ...

  3. js的数据类型--数字

    近期做一些项目的时候发现,自己的js基础还是不够扎实,再看一遍犀牛书,加深自己的理解和印象.所以从这篇文章开始,后面都是关于原生js的一些内容. 这篇文章,我们具体介绍一下js的数据类型其中一种. j ...

  4. js判断输入数字是否是整数,金额、数字

    function isIntNum(strNum){//js判断输入数字是否是整数 仅供学习思想var strCheckNum = strNum+"";if(strCheckNum ...

  5. JS正则表达式验证数字非常全 - 吾心无所 - 博客园

    JS正则表达式验证数字非常全 Js代码 <script type="text/javascript"> function SubmitCk() { var reg = ...

  6. MUI 里js动态添加数字输入框后,增加、减少按钮无效

    https://www.cnblogs.com/ssjf/p/10193652.html numbox 的自动初化是在 mui.ready 时完成的 mui 页面默认会自动初始化页面中的所有数字输入框 ...

  7. js布尔类型+数字判断_C ++中的布尔数据类型

    js布尔类型+数字判断 In this article, we'll take a look at the Bool datatype in C++. 在本文中,我们将介绍C ++中的Bool数据类型 ...

  8. JS字符串过滤数字_过滤大写数字

    JS字符串过滤数字_过滤大写数字 代码案例: //数字替换 if(data.summary){data.summary=data.summary.replace(/[\d|壹|贰|叁|肆|伍|陆|柒| ...

  9. 编程领域名词:魔法数值、魔法数字、魔法值

    魔法数值.魔法数字.魔法值,这是一个东西,不同的叫法. 魔法数字,在编程领域指的是莫名其妙出现的数字.数字的意义必须通过详细阅读才能推断出来.一般魔法数字都是需要使用枚举变量来替换的. 魔法数字常见于 ...

最新文章

  1. CapsuleNet(了解)
  2. 知乎热帖:Qt 这么强大为什么火不起来?
  3. JFrame 简单使用
  4. 原创“.NET研究”企业级控件库之图片浏览控件
  5. android 跑分软件,跑分软件安兔兔公布了6月份Android手机性能榜TOP10
  6. CV之face_recognition:Py之face_recognition库安装、介绍、使用方法详细攻略
  7. 4.Java中的关键字和标识符
  8. 【求助】如何从 Spark 的 DataFrame 中取出具体某一行?我自己的一些思考
  9. 数字孪生-输电铁塔及线路的结冰、融化
  10. (79)【按键】[独立按键] - 1: 单击,双击,三击以及N击
  11. 怎么批量查询银行卡号是哪个银行?
  12. 交互体验设计优秀的产品
  13. 解决pycharm里显示数据不完全问题(pandas)
  14. 如何对文本框进行功能测试
  15. UE4+手柄对应按键测试
  16. 三维扫描系列 点云绪论
  17. Android如何动态更换桌面图标(巨坑)
  18. 论文浅尝 - IJCAI2022 | 基于自适应虚词增强的小样本逆关系分类
  19. 45RF SOI CMOS
  20. 关于office及edge浏览器无法登录微软账号的问题

热门文章

  1. 妙用postman系列——postman建组、分享
  2. 2021-2027全球与中国跨临界二氧化碳系统市场现状及未来发展趋势报告
  3. 2022-2028年中国金属薄膜行业市场深度监测及投资潜力研究报告
  4. Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务
  5. 关于某日访问次数最多的IP的topK问题的三种解法
  6. 快速通过nginx配置域名访问
  7. 解决LC_ALL: 无法改变区域选项 (UTF-8): 没有那个文件或目录的问题
  8. 每个人都应该有一个梦想
  9. 如何用python读取文本中指定行的内容
  10. CPU0 处理器的架构及应用