1.基础实用基础的数据结构详情
数据结构(data structure [ˈstrʌktʃə(r)] )是计算机存储、组织数据的方式;
算法(algorithm [ˈælɡərɪðəm] )是解决问题的方法/步骤和策略;
数据结构Array
js中的数组结构非常简单(浏览器帮助我们进行封装处理好的)
- 可以存储不同的数据类型值
- 数组容量伴随存储内容自动缩放
- Array.prototype上提供数组的操作方法
优势:基于索引直接进行查找和获取,效率很高;
弊端:进行中间插入和删除时,性能非常低(数组坍塌 和 删除中间项的优化)
栈结构Stack
- 先进后出;
- 只能在一段操作:包括添加(进栈)和删除(出栈);
- 递归算法中的无限递归会出现栈溢出。
栈方法:
class Stack { container = []; // 进栈 enter(element) { this.container.unshift(element); } // 出栈 leave() { return this.container.shift(); } // 栈的长度 size() { return this.container.length; } // 获取栈中的结果 value() { return this.container.slice(0); } } let sk = new Stack;
面试一:
有六个元素,按照 6 5 4 3 2 1 的顺序进栈(中间可以随时出栈),问哪一个出栈不是合法的:(c:遵循先进后出的原则) A: 5 4 3 6 1 2 B: 4 5 3 2 1 6 C: 3 4 6 5 2 1 D: 2 3 4 1 5 6
面试二:十进制转二进制
例如:58 => 111010
/* * 思路:把十进制数字和与2整除(因为二进制是满2进1) * 获取其余数 n%2 * 获取其商数 n/2 (当值整除为0停止) * 用上一次的商数继续除以二,一直到商数为0为止;把所有的余数从尾部到顶部依次链接可; */ //方法1 NumberObject.toString(radix) var num = 58; num.toString(2); //方法2 Numer.protype.decimal2binary = function decimal2binary(){ let sk = new Stack,decimalNum=this.valueOf(); if(decimalNum==0) return '0' //排除0,因为0转为二进制还是0 while(decimalNum>0){ sk.enter(decimalNum%2); decimalNum = Math.floor(decimalNum/2); } return sk.value().join('') } console.log((10).decimal2binary() );
队列结构 Queue
- 先进先出
- 允许在前端删除,允许在后端插入;
- 特殊:优先队列
class Queue { container = []; // 进入 enter(element) { this.container.push(element); } // 离开 leave() { return this.container.shift(); } // 队列的长度 size() { return this.container.length; } // 获取队列中的结果 value() { return this.container.slice(0); } }
面试题:击鼓传花
N个人一起玩游戏,围成一圈,从1开始数数,数到M的人自动淘汰;最后剩下的人会取得胜利,问最后剩下的是原来的哪一位?
function game(n, m) { let qe = new Queue; for (let i = 0; i < n; i++) { qe.enter(i + 1); } while (qe.size() > 1) {//当只剩下一个,循环终止 for (let i = 0; i < m - 1; i++) { //没有被选中的人重新添加到队列中 qe.enter(qe.leave()); } qe.leave(); } return qe.value().toString(); } console.log(game(8, 5)); //3
来源:https://www.cnblogs.com/Arthur123/p/12635680.html