从零开始的LeetCode竞赛解题-WeeklyContent 83

250 阅读1分钟

1.较大分组的位置

/**
 * @param {string} S
 * @return {number[][]}
 */
var largeGroupPositions = function(S) {
    let l = 0;
    const arr = [];
    // 平移处理,时间复杂度O(n)
    for(let index = 1; index < S.length; index++) {
        if(S[index] !== S[l]) {
            if(index - l >= 3) {
                arr.push([l, index-1]);
            }
            l = index;
        } else if(index === S.length - 1) {
            // 最终需要判断到头,虽然JS可以在循环中+1,但是为了防止溢出,还是这样子吧
            if(index - l >= 2) {
                arr.push([l, index]);
            }
        }
    }
    return arr;
};

2.隐藏个人信息

/**
 * @param {string} S
 * @return {string}
 */
var maskPII = function(S) {
    if(S.indexOf('@') >= 0) {
        // email
        const arr = S.toLowerCase().split('@');
        return `${arr[0][0]}*****${arr[0][arr[0].length - 1]}@${arr[1]}`
    } else {
        const num = S.replace(/[\+\-\(\)\ ]/g, '');
        console.log(num.length)
        if(num.length === 10) {
            return `***-***-${num.substr(-4)}`
        } else if(num.length > 10) {
            //正则匹配类似于千分符方式
            const res = num.substr(0, num.length - 4).replace(/(?<!\..*)(?<=\d)(?=(\d{3})+(\.|$))/g, '-');
            return `+${res.replace(/[^-]/g, '*')}-${num.substr(-4)}`
        }
    }
    return "";
};