記錄JavaScript練習筆記和知識點整理的第二天,遇到在程式里使用等差數列求和公式的操作!遇到使用正則表達式判斷數組中是否有重覆的值!又學會了新操作。 ...
Codewars地址:https://www.codewars.com/ 歡迎和大家一起來討論~ 基礎練習(1): 我的解答為:
function isIsogram(str){ if(str == "") return true; return str.toLowerCase().split("").sort().every(function(item,index,array) { return item != array[index+1]; });; }較優解一:
function isIsogram(str){ return !/(\w).*\1/i.test(str) }
較優解二:
function isIsogram(str){ var i, j; str = str.toLowerCase(); for(i = 0; i < str.length; ++i) for(j = i + 1; j < str.length; ++j) if(str[i] === str[j]) return false; return true;分析:
第一位小伙伴是使用正則表達式來判斷是否有重覆的值,方法簡單,而我一開始就沒想到可以用這個方法,Hhhh。而第二位小伙伴則是先將轉為小寫,再用一個複合迴圈來比較每個字元串與自身以外的字元串是否相等,若相等則返回false。而我的思路與第二位相似,先將判斷是否為空字元串,若為空則為true。接著再轉為小寫,使用空格分隔將字元串轉為數組,進行排序後使用迭代方法,判斷排序後的數組中是否存在相同的字元,若不存在的則返回true。
在剛開始使用迭代方法時,沒有考慮到進行每一項與數組中每一項比較的時候,自身與自身比較會返回false,導致一直錯誤。後來查了資料才選擇先排序再比較每一項與其後一項是否相等來判斷是否有重覆的值。相比之下,我想的是複雜了一些。
筆記:正則表達式:通過RegExp類型支持正則表達式,創建正則表達式的語法為:var expression = /pattern/flags;
其中模式pattern是任何正則表達式。每個正則表達式都可帶有一個或多個標記flags,用以標明正則表達式的行為。正則表達式的匹配模式支持三個標誌:g(全局)、i(不區分大消息)、m(多行模式)。因正則表達式比較複雜,具體的模式在此不再敘述了。
看較優解一的正則表達式/(\w).*\1/i ,解釋如下: 圓括弧()表示提取匹配的字元串,對字元進行分組。 括弧中的\w表示匹配包括下劃線在內的任何單詞字元。 點.表示匹配換行符以外的任何字元。星號*表示匹配零次或多次。 \1表示與第一個小括弧中要匹配的內容相同。註意\1必須配合小括弧使用。
正則表達式後的test()方法可以知道目標字元串與某個模式是否匹配,接收一個字元串參數。在模式與該參數匹配的情況下返回true。否則,返回false。
基礎練習(2):
我的解答:
function digitize(n) { return n.toString().split("").reverse(); }
一開始看到題目的時候信心滿滿,哇,這很簡單吶,先是將數值型數據轉為字元型,再使用split()方法轉為數組,最後使用reverse()方法翻轉數組就好了。結果…出現了…這樣的結果……
百思不得其解,懷疑是不是題目的測試有什麼問題,最後跑去看了答案,才知道需要在轉為數組後再將字元改為數值型,才能避免上述的錯誤。
function digitize(n) { return n.toString().split("").map(Number).reverse(); }
基礎練習(3):
我的解答為:
var isSquare = function(n){ if(n<0) return false; if(Math.sqrt(n) % 1 == 0) {return true} else {return false}; }
較優解為:
function isSquare(n) { return Math.sqrt(n) % 1 === 0; }分析:
相比之下,思路是一樣的,而我的解答則多寫了一些語句,不夠簡潔,這道題目也是很簡單的了,所有沒有筆記,Hhhh。
基礎練習(4):
我的解答為:
function GetSum( a,b ) { if(a == b) return a; var i = a>b?b:a; var length = (a>b?a:b)+1; var sum = 0; for(var i;i<length;i++) { var sum = sum + i ; } return sum; }
較優解為:
const GetSum = (a, b) => { let min = Math.min(a, b), max = Math.max(a, b); return (max - min + 1) * (min + max) / 2; }分析:
我的思路主要是求出a、b中的最大值和最小值後用for迴圈求出它們之間的數的和,想法也是挺奇葩的,Hhhh。而較優解的這位小伙伴求出最值以後,用了等差數列的求和公式,真是機智的做法!!!果然想學好編程還要能運用好數學知識呢,學到了,Hhhh。
總結:
今天做的題目所需要的知識基本和昨天是一樣的,運用方法上越來越熟練了。但是做題目的時候,經常會遇到一些自己認為理所當然是這樣做的解法,結果一測試就會發現有錯誤,感覺莫名其妙找不到錯誤的時候,經常就炸毛了。今天一次是第二個練習的錯誤,以往都是對的情況下,這次挖了坑,也知道了以後遇到問題的時候就要轉變思路,去解決問題,而不是在懷疑人生。第二次是沒有好好理解題目,以為很簡單,結果是自己理解錯誤了,這大概也是要好好理解用戶需求的意思吧,Hhhh。
偶然間做到了一道升級的題目,順利升級,看到Codewars的提示也是滿滿的鼓勵,真是路漫漫之遠兮,吾將上下而求索呀,明天繼續加油吧!