前端面试算法题(持续更新...)

一、不借助临时变量,进行两个整数的交换

//方法一 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)

二、字符串查找:请使用最基本的遍历来实现判断字符串 a 是否被包含在字符串 b 中,并返回第一次出现的位置(找不到返回 -1)。

例子:

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

答案:

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;
}

三、统计一个字符串出现最多的字母:给出一段英文连续的英文字符窜,找出重复出现次数最多的字母。

例子:

输入 : afjghdfraaaasdenas
输出 : a

答案:

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;

四、找出下列正数组的最大差值

例子:

输入 [10,5,11,7,8,9]
输出 6

答案:

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;
}

五、斐波那契数列:1、1、2、3、5、8、13、21。输入n,输出数列中第n位数的值。

方案一:

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

方案二:

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

六、用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));

七、数组去重

方案一:

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);
[![](https://img.javascriptcn.com/131848eb3cf5f184924a10e56bdf9ee2.png) ](/u/zhongshenchengchangxing)

关注作者

推荐阅读
![Planets](https://img.javascriptcn.com/cc7a2ae396528a95405fd40cdcbdc1d9.png)
原文链接:segmentfault.com

上一篇:基于 Laravel6.x 构建的博客应用,支持 Markdown,支持图片拖拽上传,基于 RBAC 权限管理系统
下一篇:解决Echarts坐标轴最后一项标签的字体加粗的问题

相关推荐

官方社区

扫码加入 JavaScript 社区