日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

[JS]题解 | #魔法数字#

發布時間:2023/11/27 生活经验 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [JS]题解 | #魔法数字# 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題解 | #魔法數字#


題目鏈接

魔法數字


題目描述

牛妹給牛牛寫了一個數字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]题解 | #魔法数字#的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。