摘要:如果是將重復次,一下子就可以想到這種快速算法用代碼實現同樣的算法可用于次次次次但是如果是要求重復次呢這就需要調整一下上述的算法。
如果是將 "*" 重復 8 次,一下子就可以想到這種快速算法:
"*" + "*" => "**"
"**" + "**" => "****"
"****" + "****" => Bingo!
用 JavaScript 代碼實現:
var n = 8; var str = "*"; while ((n >>>= 1) > 0) { str += str; } console.log(str);
同樣的算法可用于 16 次、32 次、64 次、1024 次...
但是如果是要求重復 9 次呢?這就需要調整一下上述的算法。
先抽象出一個函數 repeat: (str: string, n: number) => string:
repeat("*", 3) => "***"
repeat("ab", 1) => "ab"
repeat("abcd", 0) => ""
...
然后開始分析:
當 n 為偶數時:
repeat(str, n) <= repeat(str, n >>> 1) + repeat(str, n >>> 1)
比如:repeat("abc", 12) <= repeat("abc", 6) + repeat("abc", 6)
當 n 為奇數時,即 n - 1 為偶數:
repeat(str, n) <= str + repeat(str, n - 1)
比如:repeat("*", 21) <= "*" + repeat("*", 20)
當 n 為 1 時:repeat(str, 1) <= str
當 n 為 0 時:repeat(str, 0) <= ""
用 JavaScript 代碼實現:
function repeat(str/*:string*/, n/*:number*/) { if (n === 0) return ""; if (n === 1) return str; // `n` 為奇數 if (n % 2) return str + repeat(str, n - 1); // `n` 為偶數, // 但是要把 `repeat(str, n >>> 1)` 緩存起來, // 以避免重復兩次計算 return (str = repeat(str, n >>> 1)) + str; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91988.html
摘要:如果我們把非布爾值作為條件呢打開控制臺并運行上述代碼,會打印說明條件為真值。在中,真值指的是在布爾值上下文中轉換后的值為真的值。兩個能夠建立元素間一一對應的集合稱為互相對等集合。 showImg(https://segmentfault.com/img/bVbtSvt?w=720&h=360); 為了保證可讀性,本文采用音譯而非直譯。 Javascript 一直是神奇的語言。 不相信我...
摘要:前言繼續向下看廖大教程,看到了函數式編程這一節,當時是覺得沒啥用直接跳過了,這次準備要仔細看一遍了,并記錄下一些心得。 前言 繼續向下看廖大教程,看到了函數式編程這一節,當時是覺得沒啥用直接跳過了,這次準備要仔細看一遍了,并記錄下一些心得。 函數式編程 上學期有上一門叫 人工智能 的課,老師強行要我們學了一個叫做 prolog 的語言,哇那感覺確實難受,思維方式完全和之前學過的不一樣,...
摘要:在和中都保留了數組的強引用,所以在中簡單的清除變量內存并沒有得到釋放,因為還存在引用計數。而在中,它的鍵是弱引用,不計入引用計數中,所以當被清除之后,數組會因為引用計數為而被回收掉。其實我們主要注意的引用是不計引用計數的,就好理解了。 showImg(https://segmentfault.com/img/remote/1460000019147368?w=900&h=383); 前...
摘要:舉例來說即便某個失敗了,也不會導致的發生,這樣在不在乎是否有項目失敗,只要拿到都結束的信號的場景很有用。對于則稍有不同只要有子項,就會完成,哪怕第一個了,而第二個了,也會,而對于,這種場景會直接。 1. 引言 本周精讀的內容是:Google I/O 19。 2019 年 Google I/O 介紹了一些激動人心的 JS 新特性,這些特性有些已經被主流瀏覽器實現,并支持 polyfill...
摘要:在調用微信分享的時候如是這樣帶有的分享后,打開分享后的是關于這部分是微信加的。解決方法將分開將前后分開,微信就不會將拼接到之后得到的結果是,第一次打開還是會進入到,第二次打開才會進入到使用重定向在文件夾下,新建。內容然后這樣就跳轉完成 在調用微信分享api的時候: let shareUrl = https://xxxx#/abc wx.onMenuShareTimeline({ ...
閱讀 1177·2021-11-24 09:39
閱讀 2686·2021-09-28 09:35
閱讀 1078·2019-08-30 15:55
閱讀 1371·2019-08-30 15:44
閱讀 884·2019-08-29 17:00
閱讀 1980·2019-08-29 12:19
閱讀 3318·2019-08-28 18:28
閱讀 695·2019-08-28 18:10