這兩天微博上看到左耳朵耗子吐槽了一下node社區的left-pad的代碼,原po連接node
我也思考了一下 怎麼用實現一個left-pad比較合適,上圖代碼確實比較搓
leftpad功能,就是字符串前面拼指定字符到固定長度,好比
leftpad('hello',20,'1'),就要返回'111111111111111hello'python
function leftpad(str, len, ch) { if (!ch && ch !== 0) ch = ' '; var len = len - str.length; return Array(len).join(ch) + str; }
function leftpad(str, len, ch) { if (!ch && ch !== 0) ch = ' '; var len = len - str.length; return Array.prototype.join.call({ length:len },ch)+str; }
若是把Array.prototype.join緩存到外部變量裏,屢次使用速度更快git
var _join = Array.prototype.join function leftpad(str, len, ch) { if (!ch && ch !== 0) ch = ' '; var len = len - str.length; return _join.call({ length:len },ch)+str; }
上面複雜度都是O(N)的,既然核心思路是把字符串重複n次,能夠用二分法,好比把s,重複20次,拼在str前面,大概過程以下github
total = '' ch = 's' 20是偶數 ch變成ss 長度變成10 10是偶數 ch變成ssss 長度變成5 5是奇數 total += ch(total變成ssss) ch變成ssssssss(8個) 長度變成2 2是偶數 ch繼續變成(ssssssssssssssss)(16個s) 長度變成1 total= total+ch(4個加16個) 結束代碼 拼接str 返回
代碼以下數組
function leftpad(str, len, ch) { if (!ch && ch !== 0) ch = ' '; var len = len - str.length, total = '' while (true) { // 若是len是基數,total上就加一個ch if (len % 2 == 1) total += ch; if (len == 1) return total + str;; // 每次ch都變成chch ch += ch; //長度減半 len = parseInt(len / 2); } }
最後寫完這些,看了耗子大神微博貼的代碼,忽然想起求餘和除以二取整,能夠用 按位與len&1 和右移len>>1代替,囧,仍是代碼寫的太少,沒想到緩存
function leftpad(str, len, ch) { if (!ch && ch !== 0) ch = ' '; var len = len - str.length, total = '' while (true) { // 若是len是基數,total上就加一個ch if (len & 1 == 1) total += ch; if (len == 1) return total + str;; // 每次ch都變成chch ch += ch; //長度減半 len = len>>1; } }
你們能夠嘗試用python實現一下(不要用自帶的rjust),本文僅提供一個思路,很小的一個功能函數,可能還會有不少更好的優化和實現,歡迎你們多指教寫代碼過程當中仍是要多思考,共勉函數