前端-数据结构和算法(一)

别等时光非礼了梦想. 提交于 2020-04-05 16:37:53

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

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!