三道關於字符串的JavaScript面試題解析

分享幾道js面試題,本身感受仍是挺重要的,當看到題目的時候但願你們先花幾秒鐘考慮一下,
而後在看答案。若是有比較好的解法,歡迎你們留言指正,謝謝你們!面試

第一題

題目: 寫一個字符串轉換成駝峯的方法? 正則表達式

例如:border-bottom-color -> borderBottomColor數組

方法一

let str = "border-bottom-color";

function change(val){
     // 用‘-’切分紅一個數組
    let arr = val.split('-');  
   
   // 首字符大寫
   for(let i = 1; i < arr.length; i++){
     arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
   } 
   
   // 將字符串拼接後返回
    return arr.join('');
}

點評: 這種方法雖然能夠實現,但仍是太LOW了,一點都不簡潔。函數

方法二

let str = "border-bottom-color";

function change(val){
     return str.split('-').reduce((prev,cur,index) => {
         return prev + cur.charAt(0).toUpperCase()+cur.substring(1);
    });
}

點評: 這種方法使用了數組的 reduce() 方法,稍微簡潔了一點點,但仍是不夠好。code

方法三

let str = "border-bottom-color";

function change(val){
     // 定義正則表達式
     let re = /-(\w)/g;
      
     return str.replace(re,($0,$1) => {
        return $1.toUpperCase();
    });
}

點評: 第三種方法使用正則表達式,效果仍是不錯的。對象

備註:
replace()方法的第二個參數能夠是一個函數:
參數一:$0 正則的總體 -b -c
參數二:$1 正則當中子項的第一個(用括號括起來的就叫作子項) b c字符串

第二題

題目: 查找字符串中出現最多的字符和個數? string

例如:abbcccddddd -> 字符最多的是d,出現了5次it

方法一

let str = "abbcccddddd";

let obj = {};

// 生成obj對象
for(let i = 0;i < str.length; i++){
    let cur = str[i]; // 當前字符
    
    if(!obj[ cur ]){
        obj[ cur ] = [];            
    }

    obj[ cur ].push(cur);
} 

// 統計次數
let num = 0;
let char = '';
for(item in obj){
    if(num < obj[item].length){
        num = obj[item].length;
        char = obj[item][0];
    }
}
console.log(`字符最多的是${char},出現了${num}次`);

點評: 雖然能實現,可是太麻煩。io

方法二

let str = "abbcccddddd";

// 生成obj
let obj = str.split('').reduce((prev,cur) => {
    prev[cur] ? prev[cur]++ : prev[cur] = 1;
    return prev;
},{});

// {a: 1, b: 2, c: 3, d: 5}


let num = 0;
let char = '';

// 統計次數
for(item in obj){
    if(num < obj[item]){
        num = obj[item];
        char = item;
    }
}
console.log(`字符最多的是${char},出現了${num}次`);

點評: 稍微好一點。仍然是使用 reduce() 這個方法。
哈哈,萬能的 reduce

方法三

let str = "abcabcabcbbccccc";
let num = 0;
let char = '';

 // 使其按照必定的次序排列
str = str.split('').sort().join('');
// "aaabbbbbcccccccc"

// 定義正則表達式
let re = /(\w)\1+/g;
str.replace(re,($0,$1) => {
    if(num < $0.length){
        num = $0.length;
        char = $1;        
    }
});
console.log(`字符最多的是${char},出現了${num}次`);

點評: :使用正則表達式老是那麼簡單。

問題三

題目: 如何給字符串加千分符?

例如:42342342342 -> 42,342,342,342

方法一

let str = "12312345678988";

// 轉換的方法
function change(str){
    // 轉化爲數組
    var arr = str.split('');
    var result = [];

    while(arr.length > 3){
      result.push(arr.splice(-3,3).join(''));
    }
    result.push(arr.join(''));

    // 最終的結果
    return result.reverse().join(',');
}

點評: :將字符串轉化爲數組,而後對其切分重組。

方法二

let str = "12312345678988";

function change(str){
    // 僅僅對位置進行匹配
    let re = /(?=(?!\b)(\d{3})+$)/g; 
   return str.replace(re,','); 
}

點評: :這個正則表達式就有點屌了。

(?=) : 前向聲明
(?!) : 反前向聲明

舉個小栗子

var str = 'abacad';
   
   var re = /a(?=b)/g;
   str.replace(re,'*');  // 結果:'*bacad'
   // 將a後邊爲‘b’的a替換爲‘*’號
   
   var re = /a(?!b)/g;
   str.replace(re,'*');  // 結果:'ab*c*d'
   // 將a後邊不爲‘b’的a替換爲‘*’號
相關文章
相關標籤/搜索