[JS]题解 | #魔法数字#
生活随笔
收集整理的這篇文章主要介紹了
[JS]题解 | #魔法数字#
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題解 | #魔法數字#
題目鏈接
魔法數字
題目描述
牛妹給牛牛寫了一個數字n,然后又給自己寫了一個數字m,她希望牛牛能執行最少的操作將他的數字轉化成自己的。
操作共有三種,如下:
-
在當前數字的基礎上加一,如:4轉化為5
-
在當前數字的基礎上減一,如:4轉化為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<m,m2*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]题解 | #魔法数字#的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在开眼角多少钱啊?
- 下一篇: [JS][dp]题解 | #打家劫舍(一