2024年最全算法基础之简单线性算法(1),去阿里面试hr,会问到的问题

总结:

  • 函数式编程其实是一种编程思想,它追求更细的粒度,将应用拆分成一组组极小的单元函数,组合调用操作数据流;

  • 它提倡着 纯函数 / 函数复合 / 数据不可变, 谨慎对待函数内的 状态共享 / 依赖外部 / 副作用;

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

Tips:

其实我们很难也不需要在面试过程中去完美地阐述出整套思想,这里也只是浅尝辄止,一些个人理解而已。博主也是初级小菜鸟,停留在表面而已,只求对大家能有所帮助,轻喷🤣;

我个人觉得: 这些编程范式之间,其实并不矛盾,各有各的 优劣势

理解和学习它们的理念与优势,合理地 设计融合,将优秀的软件编程思想用于提升我们应用;

所有设计思想,最终的目标一定是使我们的应用更加 解耦颗粒化、易拓展、易测试、高复用,开发更为高效和安全

var expression = “{{}}{}{}”

var expressionFalse = “{}{{}”;

console.log(isBalanced(expression)); // true

console.log(isBalanced(expressionFalse)); // false

console.log(isBalanced(“”)); // true

function isBalanced(exp){

var stack = [];

var arr = exp.split(“”);

var len = arr.length, cur;

while(cur = arr.shift()){

if(cur === “{”) stack.push(cur);

if(cur === “}”) stack.pop();

}

if(stack.length !== 0) return false;

return true;

}

使用两个栈实现入队与出队

Array.prototype.enqueue = function(item){

return this.push(item);

};

Array.prototype.dequeue = function(){

var tempStack = [];

var cur, temp;

while(cur = this.pop()){

tempStack.push(cur);

}

temp = tempStack.pop();

while(cur = tempStack.pop()){

this.push(cur);

}

return temp;

};

寻找连续数组中的缺失的多个数

var array = [2, 5, -1, 9, -6, 3, 7];

var result = findLost(array);

console.log(result);

function findLost(arr){

if(arr.length <= 1) return null;

var sortedArr = arr.sort(function(a,b){return a-b;});

var i = sortedArr.shift();

var cur = sortedArr.shift();

var result = [];

do{

i++;

if(cur === i) cur = sortedArr.shift();

else result.push(i);

}while(cur);

return result;

}

数组中元素最大差值计算

给定某无序数组,求取任意两个元素之间的最大差值,注意,这里要求差值计算中较小的元素下标必须小于较大元素的下标。

var array = [7, 8, 4, 9, 9, 15, 3, 1, 10];

var result = findLargestDifference(array);

console.log(result);

function findLargestDifference(arr){

var min = arr[0];

var diff = 0;

for(var i = 1, len = arr.length; i < len; i++){

if(arr[i] < min){

min = arr[i];

continue;

}

if(arr[i] - min > diff){

diff = arr[i] - min;

}

}

return diff;

}

数组中元素乘积

给定某无序数组,要求返回新数组 output ,其中 output[i] 为原数组中除了下标为 i 的元素之外的元素乘积,要求以 O(n) 复杂度实现:

var firstArray = [2, 2, 4, 1];

var secondArray = [0, 0, 0, 2];

var thirdArray = [-2, -2, -3, 2];

console.log(productExceptSelf(firstArray)); // [8, 8, 4, 16]

console.log(productExceptSelf(secondArray)); // [0, 0, 0, 0]

console.log(productExceptSelf(thirdArray)); // [12, 12, 8, -12]

function productExceptSelf(arr){

var result = [];

var pro = 1;

var len = arr.length;

for(var i = 0; i < len; i++){

result.push(pro);

pro *= arr[i];

}

pro = 1;

for(i = len - 1; i >= 0; i–){

result[i] *= pro;

pro *= arr[i];

}

return result;

}

数组扁平化

var arr = [1,2,[1,3,[2,[2,3,3],[2,5]]],[6,3]];

//传统方式

function flat(arr,result=[]){

if(arr.constructor !== Array) return [arr];

var length = arr.length;

arr.forEach(function(item){

if(item.constructor !== Array) result.push(item);

else result = flat(item, result);

});

return result;

}

var flatted = flat(arr);

console.log(flatted); //[1, 2, 1, 3, 2, 2, 3, 3, 2, 5, 6, 3]

//优雅方式

var arr=[1,3,4,5,[6,[0,1,5],9],[2,5,[1,5]],[5]];

var flatter = arr => arr.reduce((a, b) => a.concat(Array.isArray(b) ? flatter(b) : b), []);

console.log(flatter(arr)); //[1, 2, 1, 3, 2, 2, 3, 3, 2, 5, 6, 3]

//另一个方法,简单但有副作用:把数组内的值全部转换成了字符串类型

var flatten = a => a.join().split(‘,’);

console.log(flatten(arr)); //[“1”, “2”, “1”, “3”, “2”, “2”, “3”, “3”, “2”, “5”, “6”, “3”]

查找字符串中出现次数最多的字符及数量

“ababccdeaeajxac”.split(‘’).sort().join(‘’).match(/(\w)\1*/g).reduce(function(a,b){ return a.length > b.length ? a : {char: b[0], length: b.length};}, {char: ‘’, length: 0}); //{char: “a”, length: 5}

字符串查找

String.prototype.indexOf = String.prototype.indexOf || function(str){

if(str.length > this.length) return -1;

var len = 0;

var _this = this.split(‘’), str = str.split(‘’);

var lenA = str.length, this_len = this.length;

var temp;

for(var i = 0, j = 0; j < lenA; i = 0, j = temp + 1, len = 0){

debugger;

while(str[i] !== _this[j] && j < this_len){

j++;

}

temp = j;

while(str[i] === _this[j] && j < this_len){

len++;

i++;

j++;

}

if(len === lenA) return temp;

}

return -1;

}

字符串查找(KMP 算法)

String.prototype.indexOf = String.prototype.indexOf || function(str){

var next = [];

var n = this.length;

var m = str.length;

calcNext(str,next);

for (var i = 0,q = 0; i < n; ++i){

while(q > 0 && str[q] != this[i])

q = next[q-1];

if (str[q] === this[i]){

q++;

}

if (q === m){

return i - m + 1;

}

}

return -1;

function calcNext(str){

var m = str.length;

next[0] = 0;

for(var q = 1, k = 0; q < m; ++q){

while(k > 0 && str[q] != str[k])

k = next[k-1];

if (str[q] == str[k]){

k++;

}

next[q] = k;

}

}

}

查看链表是否有环

function hasCircle(head){ //传入链表头

var pos1 = head;

var pos2 = head;

while(pos2){

pos1 = pos1.next;

pos2 = pos2.next !== null ? pos2.next.next : null;

if(pos1 === pos2) return true;

}

return false;

}

求一个数二进制中 1 的个数

function numberOf1(n){

if(n < 0){

n = n >>> 0;

}

var arr = n.toString(2).split(‘’);

return arr.reduce(function(a,b){

return b === “1” ? a + 1 : a;

},0);

}

翻转链表

/*function ListNode(x){

this.val = x;

this.next = null;

}*/

function reverseList(pHead){

var newHead, temp;

if(!pHead){

总结

  • 框架原理真的深入某一部分具体的代码和实现方式时,要多注意到细节,不要只能写出一个框架。

  • 算法方面很薄弱的,最好多刷一刷,不然影响你的工资和成功率😯

  • 在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。

  • 要勇于说不,对于某些 offer 待遇不满意、业务不喜欢,应该相信自己,不要因为当下没有更好的 offer 而投降,一份工作短则一年长则 N 年,为了幸福生活要慎重选择!!!

    开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

喜欢这篇文章文章的小伙伴们点赞+转发支持,你们的支持是我最大的动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值