1. 程式人生 > >前端面試之演算法題

前端面試之演算法題

雖說我們很多時候前端很少有機會接觸到演算法。大多都互動性的操作,然而從各大公司面試來看,演算法依舊是考察的一方面。實際上學習資料結構與演算法對於工程師去理解和分析問題都是有幫助的。如果將來當我們面對較為複雜的問題,這些基礎知識的積累可以幫助我們更好的優化解決思路。下面羅列在前端面試中經常撞見的幾個問題吧。

Q1 判斷一個單詞是否是迴文?

迴文是指把相同的詞彙或句子,在下文中調換位置或顛倒過來,產生首尾迴環的情趣,叫做迴文,也叫回環。比如 mamam redivider .

很多人拿到這樣的題目非常容易想到用for 將字串顛倒字母順序然後匹配就行了。其實重要的考察的就是對於reverse的實現。其實我們可以利用現成的函式,將字串轉換成陣列,這個思路很重要,我們可以擁有更多的自由度去進行字串的一些操作。

function checkPalindrom(str) {  
    return str == str.split('').reverse().join('');
}

Q2 去掉一組整型陣列重複的值

這道問題出現在諸多的前端面試題中,主要考察個人對Object的使用,利用key來進行篩選。

Array.prototype.unique2 = function()
{
    var n = {},r=[]; //n為hash表,r為臨時陣列
    for(var i = 0; i < this.length; i++) //遍歷當前陣列
    {
        if (!n[this
[i]]) //如果hash表中沒有當前項 { n[this[i]] = true; //存入hash表 r.push(this[i]); //把當前陣列的當前項push到臨時數組裡面 } } return r; }

Q3 統計一個字串出現最多的字母

Q4 不借助臨時變數,進行兩個整數的交換

輸入 a = 2, b = 4 輸出 a = 4, b =2

這種問題非常巧妙,需要大家跳出慣有的思維,利用 a , b進行置換。

主要是利用 + - 去進行運算,類似 a = a + ( b - a) 實際上等同於最後 的 a = b;

function swap(a , b) {  
  b = b - a;
  a = a + b;
  b = a - b;  return [a,b];
}

Q5 找出下列正陣列的最大差值

這是通過一道題目去測試對於基本的陣列的最大值的查詢,很明顯我們知道,最大差值肯定是一個數組中最大值與最小值的差。

function getMaxProfit(arr) {    
    var minPrice = arr[0];    
    var maxProfit = 0;    
    for (var i = 0; i < arr.length; i++) {        
            var currentPrice = arr[i];
            minPrice = Math.min(minPrice, currentPrice);        
            var potentialProfit = currentPrice - minPrice;
            maxProfit = Math.max(maxProfit, potentialProfit);
       }    
       return maxProfit;
}

Q6 隨機生成指定長度的字串

實現一個演算法,隨機生成指制定長度的字元竄。

比如給定 長度 8 輸出 4ldkfg9j

function randomString(n) {  
  let str = 'abcdefghijklmnopqrstuvwxyz9876543210';
  let tmp = '',
      i = 0,
      l = str.length;
    for (i = 0; i < n; i++) {
    tmp += str.charAt(Math.floor(Math.random() * l));
  }  return tmp;
}

Q7 氣泡排序

function sortarr(arr){
    for(i=0;i<arr.length-1;i++){
        for(j=0;j<arr.length-1-i;j++){
            if(arr[j]>arr[j+1]){
                var temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
    return arr;
}

Q7 深拷貝

簡單講,淺拷貝就是複製一份引用,所有引用物件都指向一份資料,並且都可以修改這份資料。深拷貝則是複製變數值,對於非基本型別的變數,則遞迴至基本型別變數後,再複製。

第一種方法:通過JSON解析解決

b = JSON.parse( JSON.stringify(a) )

無法複製函式
原型鏈沒了,物件就是object,所屬的類沒了。
但是他簡單呀,大多時候完全可以滿足需求了

第二種方法:通過遞迴解析解決

function deepClone(data){
       var type = getType(data);
       var obj;
       if(type === 'array'){
           obj = [];
       } else if(type === 'object'){
           obj = {};
       } else {
           //不再具有下一層次
           return data;
       }
       if(type === 'array'){
           for(var i = 0, len = data.length; i < len; i++){
               obj.push(deepClone(data[i]));
           }
       } else if(type === 'object'){
           for(var key in data){
               obj[key] = deepClone(data[key]);
           }
       }
       return obj;
   }