`
jjfat
  • 浏览: 283730 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

前端面试中的常见的算法问题

 
阅读更多

虽说我们很多时候前端很少有机会接触到算法。大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面。实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的。如果将来当我们面对较为复杂的问题,这些基础知识的积累可以帮助我们更好的优化解决思路。下面罗列在前端面试中经常撞见的几个问题吧。

 


 

Q1 判断一个单词是否是回文?

回文是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。比如 mamam redivider .

很多人拿到这样的题目非常容易想到用for 将字符串颠倒字母顺序然后匹配就行了。其实重要的考察的就是对于reverse的实现。其实我们可以利用现成的函数,将字符串转换成数组,这个思路很重要,我们可以拥有更多的自由度去进行字符串的一些操作。

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

 

Q2 去掉一组整型数组重复的值

比如输入: [1,13,24,11,11,14,1,2] 
输出: [1,13,24,11,14,2]
需要去掉重复的11 和 1 这两个元素。

这道问题出现在诸多的前端面试题中,主要考察个人对Object的使用,利用key来进行筛选。

/**
* unique an array 
**/let unique = function(arr) {  
  let hashTable = {};  let data = [];  for(let i=0,l=arr.length;i<l;i++) {    if(!hashTable[arr[i]]) {
      hashTable[arr[i]] = true;
      data.push(arr[i]);
    }
  }  return data

}module.exports = unique;  

 

Q3 统计一个字符串出现最多的字母

给出一段英文连续的英文字符窜,找出重复出现次数最多的字母

输入 : 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;  

 

Q4 排序算法

如果抽到算法题目的话,应该大多都是比较开放的题目,不限定算法的实现,但是一定要求掌握其中的几种,所以冒泡排序,这种较为基础并且便于理解记忆的算法一定需要熟记于心。冒泡排序算法就是依次比较大小,小的的大的进行位置上的交换。

function bubbleSort(arr) {  
    for(let i = 0,l=arr.length;i<l-1;i++) {        for(let j = i+1;j<l;j++) { 
          if(arr[i]>arr[j]) {                let tem = arr[i];
                arr[i] = arr[j];
                arr[j] = tem;
            }
        }
    }    return arr;
}module.exports = bubbleSort;  

除了冒泡排序外,其实还有很多诸如 插入排序,快速排序希尔排序等。每一种排序算法都有各自的特点。全部掌握也不需要,但是心底一定要熟悉几种算法。 比如快速排序,其效率很高,而其基本原理如图(来自wiki):

算法参考某个元素值,将小于它的值,放到左数组中,大于它的值的元素就放到右数组中,然后递归进行上一次左右数组的操作,返回合并的数组就是已经排好顺序的数组了。

function quickSort(arr) {    if(arr.length<=1) {        return arr;
    }    let leftArr = [];    let rightArr = [];    let q = arr[0];    for(let i = 1,l=arr.length; i<l; i++) {        if(arr[i]>q) {
            rightArr.push(arr[i]);
        }else{
            leftArr.push(arr[i]);
        }
    }    return [].concat(quickSort(leftArr),[q],quickSort(rightArr));
}module.exports = quickSort;  

安利大家一个学习的地址,通过动画演示算法的实现。

HTML5 Canvas Demo: Sorting Algorithms

 

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

输入 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];
}module.exports = swap;  

 

Q6 使用canvas 绘制一个有限度的斐波那契数列的曲线?

数列长度限定在9.

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列主要考察递归的调用。我们一般都知道定义

fibo[i] = fibo[i-1]+fibo[i-2];  

生成斐波那契数组的方法

function getFibonacci(n) {  
  var fibarr = [];  var i = 0;  while(i<n) {    if(i<=1) {
      fibarr.push(i);
    }else{
      fibarr.push(fibarr[i-1] + fibarr[i-2])
    }
    i++;
  }  return fibarr;
}

剩余的工作就是利用canvas arc方法进行曲线绘制了

DEMO

 

Q7 找出下列正数组的最大差值比如:

输入 [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;
}

 

Q8 随机生成指定长度的字符串

实现一个算法,随机生成指制定长度的字符窜。

比如给定 长度 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;
}module.exports = randomString;  

 

Q9 实现类似getElementsByClassName 的功能

自己实现一个函数,查找某个DOM节点下面的包含某个class的所有DOM节点?不允许使用原生提供的 getElementsByClassName querySelectorAll 等原生提供DOM查找函数。

function queryClassName(node, name) {  
  var starts = '(^|[ \n\r\t\f])',
       ends = '([ \n\r\t\f]|$)';  var array = [],
        regex = new RegExp(starts + name + ends),
        elements = node.getElementsByTagName("*"),
        length = elements.length,
        i = 0,
        element;    while (i < length) {
        element = elements[i];        if (regex.test(element.className)) {
            array.push(element);
        }

        i += 1;
    }    return array;
}

 

Q10 使用JS 实现二叉查找树(Binary Search Tree)

一般叫全部写完的概率比较少,但是重点考察你对它的理解和一些基本特点的实现。 二叉查找树,也称二叉搜索树、有序二叉树(英语:ordered binary tree)是指一棵空树或者具有下列性质的二叉树:

  • 任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

  • 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

  • 任意节点的左、右子树也分别为二叉查找树;

  • 没有键值相等的节点。二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、multiset、关联数组等。

 

在写的时候需要足够理解二叉搜素树的特点,需要先设定好每个节点的数据结构

class Node {  
  constructor(data, left, right) {    this.data = data;    this.left = left;    this.right = right;
  }

}

树是有节点构成,由根节点逐渐延生到各个子节点,因此它具备基本的结构就是具备一个根节点,具备添加,查找和删除节点的方法.

class BinarySearchTree {  constructor() {    this.root = null;
  }

  insert(data) {    let n = new Node(data, null, null);    if (!this.root) {      return this.root = n;
    }    let currentNode = this.root;    let parent = null;    while (1) {
      parent = currentNode;      if (data < currentNode.data) {
        currentNode = currentNode.left;        if (currentNode === null) {
          parent.left = n;          break;
        }
      } else {
        currentNode = currentNode.right;        if (currentNode === null) {
          parent.right = n;          break;
        }
      }
    }
  }

  remove(data) {    this.root = this.removeNode(this.root, data)
  }

  removeNode(node, data) {    if (node == null) {      return null;
    }    if (data == node.data) {      // no children node
      if (node.left == null && node.right == null) {        return null;
      }      if (node.left == null) {        return node.right;
      }      if (node.right == null) {        return node.left;
      }      let getSmallest = function(node) {        if(node.left === null && node.right == null) {          return node;
        }        if(node.left != null) {          return node.left;
        }        if(node.right !== null) {          return getSmallest(node.right);
        }

      }      let temNode = getSmallest(node.right);
      node.data = temNode.data;
      node.right = this.removeNode(temNode.right,temNode.data);      return node;

    } else if (data < node.data) {
      node.left = this.removeNode(node.left,data);      return node;
    } else {
      node.right = this.removeNode(node.right,data);      return node;
    }
  }

  find(data) {    var current = this.root;    while (current != null) {      if (data == current.data) {        break;
      }      if (data < current.data) {
        current = current.left;
      } else {
        current = current.right
      }
    }    return current.data;
  }

}module.exports = BinarySearchTree;

 

0
0
分享到:
评论

相关推荐

    前端JS面试中常见的算法问题总结

    虽然说在前端很少有机会接触到算法,大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一...下面这篇文章就给大家总结了在前端JS面试中常见的算法问题,有需要的朋友们可以参考借鉴,下面来一起看看吧。

    前端面试常见问题集锦册

    前端: 这指的是前端开发,是指构建在网站或者 Web 应用程序中用户直接与之...因此,“前端面试常见问题集锦册”可以理解为一本专门整理了前端面试中常见问题的参考书或资源,供求职者在准备前端开发职位面试时使用。

    前端面试题之算法题集.zip

    1. **基础数据结构**:前端面试中常见的数据结构包括数组、链表、栈、队列、哈希表、树(二叉树、平衡树如AVL和红黑树)和图等。理解这些数据结构的特性和操作方法是解决算法问题的基础。 2. **排序与查找**:快速...

    前端面试题之算法智力题汇集.zip

    在这个"前端面试题之算法智力题汇集"中,可能包含了各种难度级别的题目,从基础到进阶,涵盖了前端开发中可能遇到的各种问题。通过解题,开发者可以不断提升自己的编程能力,更好地应对面试挑战。 在学习和解答这些...

    前端面试宝典、前端面试题库、高频前端面试题、大厂面试题、算法面试题、前端面试题大全

    前端面试宝典、前端面试题库、高频前端面试题、大厂面试题、算法面试题、前端面试题大全。这是一个有答案的、高频前端面试汇总 按照高频排序,且附上最完整、通俗易懂的答案,拿必包做举例。 面试官问你必包,你...

    前端面试小册,包含Vue面试题,React面试题,JS面试题,HTTP面试题,工程化面试题,CSS面试题,算法面试题,大厂面试题

    【JavaScript】 JavaScript是前端开发的核心语言,面试中常常会涉及以下知识点: 1. **requestAnimationFrame**:这是一个...以上这些是面试中常见的技术点,掌握好这些知识将有助于在前端面试中取得优异的表现。

    前端面试大全、前端常见问题和原理总结、前端面试题、前端面试经验

    前端面试 前端面试大全、前端常见问题和原理总结、前端面试题、前端面试经验JavaScript、Vue、Webpack、TypeScript、html、css、前端架构、前端算法、前端工程搭建、前端职场、React、技术选型、移动端适配、h5、...

    前端面试算法题1

    【冒泡排序】 冒泡排序是一种简单的排序算法,它重复地遍历待排序的数列,一次...这些算法在前端面试中经常被用来考察候选人的逻辑思维和编程能力。了解并熟练掌握这些基础算法对于提升前端开发者的技能水平至关重要。

    前端面试题:常用算法.pdf

    ### 前端面试题:常用算法 #### 时间复杂度 在评估算法性能时,我们通常关注的是**时间复杂度**。它用来描述算法运行时间与输入数据规模之间的关系。通常,我们会关注最糟糕情况下的时间复杂度,因为它提供了一个...

    前端面试题之算法剑指offer题集.zip

    在准备前端面试时,不仅要理解和掌握这些算法,还需要通过实际编写代码来锻炼编程技巧。同时,对于每道题目,了解其时间复杂度和空间复杂度,以及如何优化,都是面试官关注的重点。通过对"算法剑指offer题集"的深入...

    前端面试大全、前端常见问题和原理总结、前端面试题、前端面试经验、前端知识持续更新中,包括:JavaScript、Vue、Webp

    前端面试大全、前端常见问题和原理总结、前端面试题、前端面试经验、前端知识持续更新中,包括:JavaScript、Vue、Webpack、TypeScript、html、css、前端架构、前端算法、前端工程搭建、前端职场、React、技术选型、...

    Web前端面试的常见知识点.pdf

    在Web前端面试中,重绘与重排(回流)的知识点是考核应聘者对HTML页面性能优化理解的重要方面。在面试过程中,面试官常常通过这部分内容来判断应聘者是否具备深入理解浏览器渲染机制的能力。 首先,了解什么是重绘...

    前端面试题-手写代码实现

    此外,函数式编程的概念和实践也是前端面试中常见的考察点。 3. **算法题.js**:这个文件很可能包含了各种算法实现,比如排序算法(冒泡排序、快速排序、归并排序等)、查找算法(线性查找、二分查找等)、图论问题...

    前端面试资料.zip

    这份文档可能包含了一系列前端面试中的常见问题,这些问题涵盖了JavaScript基础、DOM操作、事件处理、闭包、原型链等关键知识点。面试者应该熟悉并能够解释这些概念,同时具备解决实际编程问题的能力。 二、常见...

    96道web前端面试题96道web前端面试题.pdf

    在准备web前端面试时,面试官可能会考察求职者对基础知识的掌握情况以及解决实际问题的能力。以下是根据给定文件内容整理出的知识点: 1. 自我介绍是面试的开场环节,除了基本个人信息外,面试者应该突出自己的技术...

    最全前端面试资源(视频讲解,面试题,文档)

    同时,也会有针对前端项目经验、设计模式、前端性能优化、跨域解决方案、前端安全等问题的模拟问答,帮助面试者熟悉面试流程和常见问题。 文档部分则可能是详细的理论知识整理,包括但不限于前端开发标准、最佳实践...

    常见java前端面试题及Java面试问题集

    ### 常见Java前端面试题及Java面试问题集 #### 一、HTML/CSS 部分 **1. 什么是盒子模型?** 在网页布局中,元素被视为一个矩形区域,即“盒子”。CSS 的盒子模型由四个部分组成:content(内容)、padding(填充...

    2023大厂前端面试精选-算法题(高频)

    【算法在前端面试中的重要性】 在2023年的大厂前端面试中,算法题仍然是一个重要的考察点,尤其是高频题目。这是因为算法能力直接反映了候选人的逻辑思维、问题解决以及编程基础。掌握良好的算法知识能帮助开发者更...

    vue+react+算法前端面试.7z

    常见的前端面试算法题目包括: - 数据结构:数组、链表、栈、队列、树、图等,以及它们的操作方法。 - 排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等。 - 查找算法:线性查找、二分查找、...

    2022年最新(腾讯)前端面试题真题解析

    10. **算法与数据结构**:虽然前端面试中算法题相对较少,但掌握基础的排序、查找算法和常用的数据结构(如栈、队列、链表、树等)仍然是提高解决问题能力的关键。 通过这份2021年腾讯前端面试题真题解析,求职者...

Global site tag (gtag.js) - Google Analytics