Open Quickeryi opened 7 years ago
虽然貌似前端接触算法的机会很少或者有些人根本就没有在实际的开发中使用过算法相关的东西(其实是个人能力问题或者业务复杂度或者性能要求不高)。但是不可否认的是,当程序性能遇到瓶颈,而无法在硬件上解决问题时,算法就犹如一把利剑,一路披荆斩棘。我这里要记录的只是一些大家熟知的算法概念以及面试遇到的问题~
aba
O(n)
O(1)
// 解法一 /**
// 解法二 /**
@param n 字符串长度 */ let IsPalindrome = (str, n) => { "use strict"; if (!str) return false; let mid = Math.floor(n/2), front = mid -1, back; n%2 == 0 ? back = mid : back = mid + 1; while (front > -1) { if (str[front] != str[back]) { return false; } front--; back++; } return true; }
- [x] 统计一个字符串出现最多的字母 - 问题描述:给出一段英文连续的英文字符窜,找出重复出现次数最多的字母,例如:输入`abaaaac`,输出`a` - 解法:线性遍历 1)时间复杂度:`O(m+n)` 2)空间复杂度:`O(1)` ```javascript let findMaxDuplicateChar = (str) => { "use strict"; if (!str || str.length == 1) return str; let map = {}, char, max = 1; for (let i=0, len=str.length; i<len; i++) { if (!map[str[i]]) { map[str[i]] = 1; } else { map[str[i]]++; } } for (let key in map) { if (map[key] > max) { char = key; max = map[key]; } } return char; }
[a, b, c, d, e, f]
a
b
[c, d, e, f, a, b]
O(m*n)
X^T
X
X="abc"
X^T="cba"
(X^TY^T)^T=YX
/**
- [x] 数组去重 - 问题描述:去除数组重复元素 - 方法一:遍历法 1)时间复杂度:`O(n)` 2)空间复杂度:`O(1)` - 方法二:ES6实现 ```javascript // 方法一 let unique = (arr) => { "use strict"; if (!Array.isArray(arr) || arr.length < 2) return arr; let data = [], hasMap = {}; for (let i=0, len=arr.length; i<len; i++) { let key = `${typeof arr[i]}${JSON.stringify(arr[i])}`; if (!hasMap[key]) { hasMap[key] = !!1; data.push(arr[i]); } } return data; }
// 方法二 let unique = (arr) => { "use strict"; if (!Array.isArray(arr) || arr.length < 2) return arr; return Array.from(new Set(arr)); }
参考一 参考二
数组去重的方法一,不合适对象的去重。
let key = ${typeof arr[i]}${arr[i]}; 里 arr[i] 如果是对象,会调用其 toString 方法,得到的是 "[object Object]",所以如果你的输入是 [{a: 1}, {a: 2}],去重返回的结果是 [{a: 1}]
${typeof arr[i]}${arr[i]}
写在前面
虽然貌似前端接触算法的机会很少或者有些人根本就没有在实际的开发中使用过算法相关的东西(其实是个人能力问题或者业务复杂度或者性能要求不高)。但是不可否认的是,当程序性能遇到瓶颈,而无法在硬件上解决问题时,算法就犹如一把利剑,一路披荆斩棘。我这里要记录的只是一些大家熟知的算法概念以及面试遇到的问题~
字符串相关
aba
O(n)
2)空间复杂度:O(1)
O(n)
2)空间复杂度:O(1)
// 解法二 /**
@param n 字符串长度 */ let IsPalindrome = (str, n) => { "use strict"; if (!str) return false; let mid = Math.floor(n/2), front = mid -1, back; n%2 == 0 ? back = mid : back = mid + 1; while (front > -1) { if (str[front] != str[back]) { return false; } front--; back++; } return true; }
数组相关
[a, b, c, d, e, f]
前面的2个元素a
和b
移动到数组的尾部,使得原数组变成[c, d, e, f, a, b]
O(m*n)
2)空间复杂度:O(1)
X^T
,即把X
的所有字符反转(如,X="abc"
,那么X^T="cba"
),那么就得到下面的结论:(X^TY^T)^T=YX
,显然就解决了字符串的反转问题 1)时间复杂度:O(n)
2)空间复杂度:O(1)
/**
// 解法二 /**
/**
// 方法二 let unique = (arr) => { "use strict"; if (!Array.isArray(arr) || arr.length < 2) return arr; return Array.from(new Set(arr)); }