今日在leetCode 刷算法題,遇到一道題:javascript
原題連接: https://leetcode.com/problems...
此題要求實現一個大寫轉小寫的函數,當時腦海中第一時間浮現的是,js不是提供了一個
toLowerCase函數麼?因而我堅決果斷的寫下了答案:java
/** * @param {string} str * @return {string} */ var toLowerCase = function(str) { return str.toLowerCase(); };
but,我想事情沒有這麼簡單,除非做者腦殼被門擠了,因而我就思考,js的toLowerCase 是如何實現的?算法
查閱資料後我知道了,計算機全部的字符都基於ASCII編碼,下面是ASCII 基礎編碼的映射表:函數
此時,咱們不難發現,A-Z 和 a-z 的 ASCII 編碼的十進制恰好相差32,因而咱們的實現思路就是將大寫的轉成十進制編碼,再轉換成小寫字母的十進制編碼,最後獲得小寫字母。js有兩個函數能實現這兩種轉換:編碼
String.fromCharCode(num1, ..., numN) //把編碼轉換成對應的字符串 str.charCodeAt(index) //獲取字符串的編碼
下面,咱們就動手實現。spa
/** * @param {string} str * @return {string} */ var toLowerCase = function(str) { // ASCII 編碼大寫小寫相差32 let arr = str.split(''); let AscCode; let maxCode = 'Z'.charCodeAt(); let minCode = 'A'.charCodeAt(); for (let i = 0; i < arr.length; i++) { // 轉換爲ASCII碼 AscCode = arr[i].charCodeAt(); // 大寫字母,轉小寫 if (maxCode >= AscCode && minCode <= AscCode) { arr[i] = String.fromCharCode(AscCode+32); } } return arr.join(''); };
/** * @param {string} str * @return {string} */ var toUpperCase = function(str) { // ASCII 編碼大寫小寫相差32 let arr = str.split(''); let AscCode; let maxCode = 'z'.charCodeAt(); let minCode = 'a'.charCodeAt(); for (let i = 0; i < arr.length; i++) { // 轉換爲ASCII碼 AscCode = arr[i].charCodeAt(); // 大寫字母,轉大寫 if (maxCode >= AscCode && minCode <= AscCode) { arr[i] = String.fromCharCode(AscCode-32); } } return arr.join(''); };
本人刷題庫,感興趣的能夠交流: https://www.yuque.com/u46795/...