前端面试算法题

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


//方法一 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,9,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,end);
         }else if(target < arr[mid]){
             end = mid - 1;
             return binarySearch(arr,end);
         }else{
             return -1;
    }
}
var arr = [1,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,3,7];
console.log(fn(arr));
方案二:

var arr = [2,7];
var setArr = new Set(arr);
var newArr = Array.from(setArr);
console.log(newArr);
方案三:

var arr =[1,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);

相关文章

1==&gt;简述一下src与href的区别 src用于替换当前元素;...
什么是window对象?什么是document对象? window对象代表浏览...
1 》vue-router有哪几种导航钩子? 第一种:是全局导航钩子:...
1=&gt;为什么data是一个函数 【理解】 组件的data写成一...
01 vue3的新特征 1.组合式API. setUp作为组合函数的入口函数...