TypeScript算法题小试牛刀

241 阅读3分钟

题目一

有6个元素:654321。下列哪一个不是合法的出栈序列?

A:543612 B:453216 C:34652C D:23415D

思路

首先我们都知道,栈的方式是后进先去 LIFO(last in first out)。

千万不要觉得 A、B、C、D答案都是错的。只有6,5,4,3,2,1出栈的方式是对的,这只是很多种方式中的一种。

正确的解题思路是不一定要等到其他元素都进栈后 再出栈。比如以A的方式进行模拟。

A: 6进栈 5进栈 5出栈 4进栈 4出栈3进栈3出栈 6出栈 2进栈 1进栈1出栈 2出栈

画图思考,这里通过答案A的方式进行一个gif的示例。

栈结构面试题一.gif

遵循 LIFO 的规则,在进行 C的顺序操作的时候,

image.png

小结

主要就是去理解下,栈结构。它是一种受限的线性结构,后进先出(LIFO)。

  • 其限制是仅允许在 表的一端 进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。

  • LIFO(last in first out)表示就是后进入的元素, 第一个弹出栈空间。

  • 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。

  • 从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

ts封装栈结构

一般在stack 结构中,包含

  1. push 压栈的方法
  2. pop 出栈的方法,并返回弹出栈的元素
  3. peek 返回栈顶的元素
  4. isEmpty 判断栈中是否还有元素
  5. size 返回栈中元素的个数

代码传送门:封装stack结构完整代码

/**

* 基于数组的方式实现一个栈结构

*

*/

class ArrayStack<T> implements IStack<T> {

    private data: T[] = [];

    push(element: T): void {

    this.data.push(element);

    }

    pop(): T | undefined {

    return this.data.pop();

    }

    peek(): T | undefined {

    return this.data[this.data.length - 1];

    }

    isEmpty(): boolean {

    return this.data.length === 0;

    }

    size(): number {

    return this.data.length;

    }

}

题目二

十进制转二进制?

给定一个任意数字,如图所示进行。将该十进制数字和2整除(二进制是满

二进一),直到结果是0为止。最后将余数反向有序的进行拼接。得到结果

image.png

  1. 先将 十进制的数字 % 2,将余数压入栈中。
  2. 遍历栈中的元素,并将结果拼接
function decimalToBinary(decimal: number): string {

    const stack = new ArrayStack<number>();

    while (decimal > 0) {

    const result = decimal % 2;

    stack.push(result);

    decimal = Math.floor(decimal / 2);

    }
    let binary = "";

    while (!stack.isEmpty()) {

    binary += stack.pop();

    }

    return binary;

}

代码传送门:完整代码

题目三

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。

  • 左括号必须以正确的顺序闭合。

  • 每个右括号都有一个对应的相同类型的左括号。

力扣中题目

image.png 这道题目还是比较有意思的。核心点:括号之间是一一对应的关系。 比如 当字符串中出现 左括号其对应的就是右括号

  1. 在遍历字符串的时候进行判断,在遇到左边的括号的时候,将其对应的右括号压入栈中。
  2. 如果遍历的时候遇到右括号,将栈的元素弹出并进行比较。如果不相等那么不一致。
  3. 最后判断栈中的元素是否都弹出。
function isValid(s: string): boolean {

    const stack = new ArrayStack<string>();

    for (let i = 0; i < s.length; i++) {

    const iAt = s[i];

    if (iAt == "(") {

    stack.push(")");

    } else if (iAt == "{") {

    stack.push("}");

    } else if (iAt == "[") {

    stack.push("]");

    } else {

    if (iAt !== stack.pop()) {

    return false;

    }

    }

}
return stack.isEmpty();

}

代码传送门:完整代码

一点想法

如今的处境好像有点难,除了八股文,还要准备 刷算法,再读一读 读源码。跟之前的基础三件套htmljscss相比。我暂时把这些定义后三件套吧。前端真有意思哈~(ps:是真的卷阿)。你们怎么看尼~欢迎评论区留言吧