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()。