iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
自我挑戰組

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

Your order, please

今日kata

原始題目如下:(6kyu)
Your task is to sort a given string. Each word in the string will contain a single number. This number is the position the word should have in the result.

Note: Numbers can be from 1 to 9. So 1 will be the first word (not 0).

If the input string is empty, return an empty string. The words in the input String will only contain valid consecutive numbers.

翻譯:
字串中每一個單字會包含1~9的數字,按照1~9順序,重新排列單字組合完成正確的句子。

範例:

"is2 Thi1s T4est 3a"  -->  "Thi1s is2 3a T4est"
"4of Fo1r pe6ople g3ood th5e the2"  -->  "Fo1r the2 g3ood 4of th5e pe6ople"
""  -->  ""

構想&解法

function order(words){
  var reg=new RegExp('[0-9]+')
  return words.split(' ').sort((a,b)=>a.match(reg)-b.match(reg)).join(' ')                    
}

字串要做陣列進階的處理,一樣是先使用的split()切割字串。
sort()中compare function要傳入排序依據match(reg)回傳1~9中符合哪個數字的結果,以match出的數字當作排序依據,並直接改變words陣列的排列!

在前面的Find the smallest integer in the array有稍微提到sort()的使用。


其他解法觀摩

function order(words){
  return words.split(' ').sort(function(a, b){
      return a.match(/\d/) - b.match(/\d/);
   }).join(' ');
}   

解法差不多一樣是使用regex去sort!


整理用法

正規表示式

基本用法: (以下正規表示式省略頭尾的 //)

正規表示式 說明 成立字串 不成立字串
a 包含a的字串 ab,cba xyz
^a 以a開頭的字串 ab,abc bca
a$ 以a結尾的字串 qwea,reda ased,adde
[123] 包含1 or 2 or 3的字串 as3,fv2 as4
[0-9] 包含數字的字串 This1, Th1is this
[a-z0-9] 包含數字小寫字母的字串 job work 4love !@#
[^0-9] 含數字的字串 mom, dad 4love

跳脫特定字元:(以下正規表示式省略頭尾的 //)

正規表示式 說明
\d 任意數字,等同於[0-9]
\D 任意非數字字元,等同於 [^0-9]
\w 所有文字
\W 所有非文字字元,標點符號或特殊字元
\s 空白字元
\S 非空白字元

匹配次數

正規表示式 說明
/a?/ 0或1個a
/a+/ 至少1個a
/a*/ 0或多個a(任意~)
/a{4}/ 四個a

regex不用時,很容易忘,網路有很多檢測的網站可以使用。

Ex:自己比較常用regex101
通常這類型的網站會幫忙把匹配的字元反白外,還會有文字解釋你輸入的正規表示式。
https://ithelp.ithome.com.tw/upload/images/20200927/201281226YOy5ViegD.jpg
圖摘自regex101

另外推推RegexOne也很適合拿來學習正規表示法,有分成Lesson和Problem的單元,每一個單元都有一個主題,吸收完文字說明後,還有底下的練習可以當驗收!

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


上一篇
Bit Counting
下一篇
Array.diff
系列文
菜鳥工程師的奇幻漂流:跟著kata活化手指和意識30

尚未有邦友留言

立即登入留言