在前端工程师的工作中,一般很少有机会接触到算法. 但是在面试时也会有一些算法题,这并不是面试官闲得蛋疼为难你, 对于程序员来说, 学习算法知识可以让我们更高效地理解和分析问题. 这里整理了一些常见的有关算法的前端面试题
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[i]]) {
hashTable[arr[i]] = true;
data.push(arr[i]);
}
}
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[i]>arr[j]) {
let tem = arr[i];
arr[i] = arr[j];
arr[j] = tem;
}
}
}
return arr;
}
除了冒泡排序外,其实还有很多诸如插入排序,快速排序,希尔排序等。每一种排序算法都有各自的特点,感兴趣的朋友可以看看我之前的几个帖子.
参考链接:https://www.jianshu.com/p/7331c9a776ea
|