前端面試算法題(持續更新...)

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

//方法一 ES6
var a = 1, b = 2;
[a,b] = [b,a];
console.log(a,b)
 
// 方法二 異或運算,同爲0或者同爲1都爲0,10爲1
var c = 3, d = 4;
c = c ^ d;
d = c ^ d;
c = c ^ d;
console.log(c,d)複製代碼

2、字符串查找:請使用最基本的遍從來實現判斷字符串 a 是否被包含在字符串 b 中,並返回第一次出現的位置(找不到返回 -1)。

例子:數組

a='34';b='1234567'; // 返回 2
a='35';b='1234567'; // 返回 -1
a='355';b='12354355'; // 返回 5
isContain(a,b);複製代碼

答案:bash

function isContain(a, b) {
  for (let i in b) {
    if (a[0] === b[i]) {
      let tmp = true;
      for (let j in a) {
        if (a[j] !== b[~~i + ~~j]) {
          tmp = false;
        }
      }
      if (tmp) {
        return i;
      }
    }
  }
  return -1;
}複製代碼

3、統計一個字符串出現最多的字母:給出一段英文連續的英文字符竄,找出重複出現次數最多的字母。

例子:markdown

輸入 : afjghdfraaaasdenas
輸出 : a複製代碼

答案:oop

function findMaxDuplicateChar(str) { 
 if(str.length == 1) {
  return str;
 }
 let charObj = {};
 for(let i=0;i<str.length;i++) {
  if(!charObj[str.charAt(i)]) {
   charObj[str.charAt(i)] = 1;
  }else{
   charObj[str.charAt(i)] += 1;
  }
 }
 let maxChar = '',
   maxValue = 1;
 for(var k in charObj) {
  if(charObj[k] >= maxValue) {
   maxChar = k;
   maxValue = charObj[k];
  }
 }
 return maxChar;
  
}
  
module.exports = findMaxDuplicateChar;複製代碼

4、找出下列正數組的最大差值

例子:ui

輸入 [10,5,11,7,8,9]
輸出 6複製代碼

答案:spa

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;
}複製代碼

5、斐波那契數列:一、一、二、三、五、八、1三、21。輸入n,輸出數列中第n位數的值。

方案一:code

function fn(n){
        var num1 = 1, num2= 1, num3 = 0;
        for(var i=0;i<n-2;i++){
            num3 = num1+num2;
            num1 = num2;
            num2 = num3;
        }
        return num3;
    }
console.log(fn(7)) //13複製代碼

方案二:orm

function fn(n){
   if(n<=2){
        return 1;
   }
   return fn(n-1)+fn(n-2);
 }
console.log(fn(7)) //13複製代碼

6、用js實現二分查找:二分查找的前提是有序數組

例子:視頻

將要查找的值每次與中間值比較,大於中間值,則在右邊進行相同的查找,小於中間值則在左邊進行比較查找,找到返回索引值,沒找到返回-1。

1.非遞歸:遞歸

function binarySearch(target,arr){
    var start = 0;
    var end = arr.length-1;
    while(start <= end){
        var mid = parseInt((start+end)/2);
        if(target == arr[mid]){
            return mid
        }else if(target > arr[mid]){
            start = mid + 1;
        }else if(target < arr[mid]){
            end = mid - 1;
        }else{
            return -1;
        }
    }
}
var arr = [1,2,4,6,8,9,11,34,67];
console.log(binarySearch(11,arr));複製代碼

2.遞歸:

function binarySearch(arr,target,start,end){
    var start = start || 0;
    var end = end || arr.length-1;
    var mid = parseInt((start+end)/2);
    if(target == arr[mid]){
             return mid
         }else if(target > arr[mid]){
             start = mid + 1;
             return binarySearch(arr,target,start,end);
         }else if(target < arr[mid]){
             end = mid - 1;
             return binarySearch(arr,target,start,end);
         }else{
             return -1;
    }
}
var arr = [1,2,4,6,8,9,11,34,67];
console.log(binarySearch(arr,11));複製代碼

7、數組去重

方案一:

function fn(arr){
    var obj = {};
    var newArr = [];
    for(var i=0;i<arr.length;i++){
        if(!obj[arr[i]]){
            obj[arr[i]] = 1;
            newArr.push(arr[i]);
        }
    }
    return newArr;
}
var arr = [2,4,7,3,5,2,8,7];
console.log(fn(arr));複製代碼

方案二:

var arr = [2,4,7,3,5,2,8,7];
var setArr = new Set(arr);
var newArr = Array.from(setArr);
console.log(newArr);複製代碼

方案三:

var arr =[1,2,2,4,5,4,11,6];
function fn(arr){
    var a=arr;
    for(var i=0;i<a.length;i++){
       for(var j=a.length-1;j>i;j--){
           if(a[i]==a[j]){
                a.splice(j,1);
           }
       }
    }
    return a;
}
var s=fn(arr);
console.log(s);複製代碼

配套視頻課程連接:www.3mooc.com/front/learn…

我錄製的視頻連接:

www.3mooc.com/front/couin…

www.3mooc.com/front/couin…

相關文章
相關標籤/搜索