iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
自我挑戰組

菜鳥工程師的奇幻漂流:跟著kata活化手指和意識系列 第 17

Isograms

今日kata

原始題目如下:(7kyu)
An isogram is a word that has no repeating letters, consecutive or non-consecutive. Implement a function that determines whether a string that contains only letters is an isogram. Assume the empty string is an isogram. Ignore letter case.

翻譯:
單字中一個字母只出現一次(不分大小寫),回傳true。

範例:

isIsogram("Dermatoglyphics") == true
isIsogram("aba") == false
isIsogram("moOse") == false // -- ignore letter case

構想&解法

function isIsogram(str) {
  let strArr = str.toLowerCase().split('').sort()
  let result = true
  strArr.forEach((item, index, arr) => {
    if (item == arr[index + 1]) {
      result = false
    }
  })
  return result
}

先統一轉成大寫或小寫切割字串成陣列排序,相同字母會被排在一起。
Ex: abaabb --> aaabbb

使用forEach遍歷陣列,一一check與下一個元素是否相同。再度出現很冗的寫法


其他解法觀摩

function isIsogram(str){ 
  return !/(\w).*\1/i.test(str)
}

截至目前正規表示式真的無所不在! 一行K.O.!

  • \w: 找數字、字母及底線,等同於[a-zA-Z0-9_]
  • .*
    • .:匹配任一字元 (換行除外)
    • *:匹配前一字元出現0~多次
  • \1:表示\w擷取到的字元
  • i: 忽略大小寫

function isIsogram(str){
  return new Set(str.toUpperCase()).size == str.length;
}

使用到Set中不重複的特性!


整理用法

RegExp-Capturing groups

以下內容及範例取自Javascript Info-Capturing groups

(...):

  • 匹配到的部分可以單獨抽出來做使用
  • 在括號後可以加上正規表示式的量詞

範例1: 尋找gogogo

// go+ 代表 o這個字元緊接著g,且o出現1~多次
// go, gooo, gooooooo 都符合

//如果利用(),(go)+
// go, gogo, gogogogo都符合

範例2:尋找domain

mail.com
users.mail.com
smith.users.mail.com

規則是單字與單字之間以.隔開

let regexp = /(\w+\.)+\w+/g;
// 可以想像成(word.)(word.)(word.)(word)的組合
// (word.)可以出現1~多次

RegExp-Backreference

()分組也可以用\N表示,N為分組數字(引用、參考的概念),可以重複使用的感覺!

假設有一段文字需要把其中單引號或雙引號的內容擷取出來

let str = `He said: "She's the one!".`;
let regexp = /(['"])(.*?)\1/g;
// 再次參考到['"]
alert( str.match(regexp) ); // "She's the one!"

以上為今日分享的內容,若有錯誤或是建議,請再隨時和我聯繫。


上一篇
Create Phone Number
下一篇
The Supermarket Queue
系列文
菜鳥工程師的奇幻漂流:跟著kata活化手指和意識30

尚未有邦友留言

立即登入留言