1. 程式人生 > >codewars解題筆記 —— 字串的篩選和拼接

codewars解題筆記 —— 字串的篩選和拼接

題目:

Your job is to write a function which increments a string, to create a new string. If the string already ends with a number, the number should be incremented by 1. If the string does not end with a number the number 1 should be appended to the new string.

Examples:
foo -> foo1
foobar23 -> foobar24
foo0042 -> foo0043
foo9 -> foo10
foo099 -> foo100

將字串後面的數字加1,得到新的字串。若字串後面沒數字,則補1。

我的答案:

function incrementString (strng) {
  if (!strng.match(/\d+$/)){
    return strng + '1'
  } else {
     return strng.replace(/\d+$/,v => {
            let n = v.length
            let a = (parseInt(v) + 1).toString().length
            if (n>a) {
              return new Array(n - a + 1).join('0') + (parseInt(v) + 1)
            } else {
              return parseInt(v) + 1
            }
         })
  }
 
}
票數最高的答案

ex:incrementString("abcd00999")

function incrementString(input) {
  if(isNaN(parseInt(input[input.length - 1]))) return input + '1';
  return input.replace(/(0*)([0-9]+$)/, function(match, p1, p2) {
    console.log('match is ' + match)  // 00999
    console.log('p1 is ' + p1)        // 00
    console.log('p2 is ' + p2)        // 999
    var up = parseInt(p2) + 1;
    return up.toString().length > p2.length ? p1.slice(0, -1) + up : p1 + up;
  });
}

思考:

1、題目有兩個坑,第一,當字串末尾沒有數字的時候,給補個1。這一步我覺得我處理得比較簡單

if (!strng.match(/\d+$/)){
    return strng + '1'
  } 

   正則  /\d+$/  => 匹配結尾的所有的數字

\d  =>  匹配一個字數字符,/\d/ = /[0-9]/ 

        +   =>   匹配前一項1次或者多次,至少一次

        $   =>   匹配的是字元的結尾,在多行檢索中,匹配的是一行的結尾 

   str.match(正則) =>  match沒有找到要求的字元時,返回NAN,直接判斷是否為NAN即可。

2、當尾數為9時,往前進一位。而且數字前面的 0 不能丟,這個過程想了很久,沒有想過可以將前面的 0 和後面的數字拆開。別人的程式碼就是利用這點操作的。

3、學到生成字串 0 的方法

new Array(5).join('0')  =>   '0000' 

4、來研究下別人的程式碼

    ex:incrementString("abcd00999")

return input.replace(/(0*)([0-9]+$)/, function(match, p1, p2) {
    console.log('match is ' + match)  // 00999
    console.log('p1 is ' + p1)        // 00
    console.log('p2 is ' + p2)        // 999
    var up = parseInt(p2) + 1;
    return up.toString().length > p2.length ? p1.slice(0, -1) + up : p1 + up;
  });

replace的回撥函式中,match是字串中正則匹配到的值,p1對應的是正則中第一個圓括號裡的表示式匹配到的值,p2對應的是正則中第二個圓括號裡的表示式匹配到的值。將p2的值轉為整數再 + 1,再將相加得到的結果轉為字串,拿到他的長度,如果他的長度大於相加之前的p2的長度,說明p2的數字全是9,例如 99 => 100,則需要將p1拿到的0減去一個,即 p1.slice(0, -1)。不然將p1和加好的資料拼接好就OK了。

 p1.slice(0, -1) =>  選取從0開始到最後一個元素前的所有字元

定義和用法

slice() 方法可從已有的陣列中返回選定的元素。

語法

arrayObject.slice(start,end)
引數 描述
start 必需。規定從何處開始選取。如果是負數,那麼它規定從陣列尾部開始算起的位置。也就是說,-1 指最後一個元素,-2 指倒數第二個元素,以此類推。
end 可選。規定從何處結束選取。該引數是陣列片斷結束處的陣列下標。如果沒有指定該引數,那麼切分的陣列包含從 start 到陣列結束的所有元素。如果這個引數是負數,那麼它規定的是從陣列尾部開始算起的元素。

返回值

返回一個新的陣列,包含從 start 到 end (不包括該元素)的 arrayObject 中的元素。

說明

請注意,該方法並不會修改陣列,而是返回一個子陣列。如果想刪除陣列中的一段元素,應該使用方法 Array.splice()。