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