黑马程序员技术交流社区

标题: [上海校区] 前端面试常见的算法问题(一) [打印本页]

作者: 束玉杰    时间: 2020-2-12 15:01
标题: [上海校区] 前端面试常见的算法问题(一)

在前端工程师的工作中,一般很少有机会接触到算法. 但是在面试时也会有一些算法题,这并不是面试官闲得蛋疼为难你, 对于程序员来说, 学习算法知识可以让我们更高效地理解和分析问题.

这里整理了一些常见的有关算法的前端面试题



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

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

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

[JavaScript] 纯文本查看 复制代码
function checkPalindrom(str) { 
    return str == str.split('').reverse().join('');
}


     2 数组去重
       比如输入: [1,13,24,11,11,14,1,2]
       输出: [1,13,24,11,14,2]
       需要去掉重复的11 和 1 这两个元素。
       这道问题出现在诸多的前端面试题中,主要考察个人对Object的使用,利用key来进行筛选。
[JavaScript] 纯文本查看 复制代码
let unique = function(arr) {  
    let hashTable = {};
    let data = [];
        for(let i=0,l=arr.length;i<l;i++) {
            if(!hashTable[arr]) {
                hashTable[arr] = true;
            data.push(arr);
            }
        }
    return data
}



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


[JavaScript] 纯文本查看 复制代码
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;
}



      4 不借助临时变量,进行两个整数的交换
       输入 a = 2, b = 4 输出 a = 4, b =2
      这种问题非常巧妙,需要大家跳出惯有的思维,利用 a , b进行置换。
      主要是利用 + - 去进行运算,类似 a = a + ( b - a) 实际上等同于最后 的 a = b


[JavaScript] 纯文本查看 复制代码
function swap(a , b) { 
  b = b - a;
  a = a + b;
  b = a - b;
  return [a,b];
}


      5 排序算法
      一般面试时的算法题, 都是比较开放的题目,不限定算法的实现,但是一定要求掌握其中的几种,所以冒泡排序,这种较为基础并且便于理解记忆的算法一定需要熟记于心。冒泡排序算法就是依次比较大小,小的的大的进行位置上的交换。
[JavaScript] 纯文本查看 复制代码
function bubbleSort(arr) {  
    for(let i = 0,l=arr.length;i<l-1;i++) {
        for(let j = i+1;j<l;j++) {
          if(arr>arr[j]) {
                let tem = arr;
                arr = arr[j];
                arr[j] = tem;
            }
        }
    }
    return arr;
}

除了冒泡排序外,其实还有很多诸如插入排序,快速排序,希尔排序等。每一种排序算法都有各自的特点,感兴趣的朋友可以看看我之前的几个帖子.




参考链接:https://www.jianshu.com/p/7331c9a776ea








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2