一些前端小算法

(1)實現一個函數,判斷輸入是不是迴文字符串

function isPlalindrome(input) {
  if (typeof input !== 'string') return false;
  return input.split('').reverse().join('') === input;
}

原理:
每次輸入一個數據空格隔開,將輸入的數據變成數組在反轉,反轉後變成字符串和原始字符串比較,如果一樣則是迴文數


(2)找出無重複字符的最長子串
在這裏插入圖片描述

解法一:維護數組

在這裏插入圖片描述
在這裏插入圖片描述


解法二:優化的Map

在這裏插入圖片描述

var lengthOfLongestSubstring = function(s) {
    let map = new Map(), max = 0
    for(let i = 0, j = 0; j < s.length; j++) {
        if(map.has(s[j])) {
            i = Math.max(map.get(s[j]) + 1, i)
        }
        max = Math.max(max, j - i + 1)
        map.set(s[j], j)
    }
    return max
};

(3)數據結構棧

棧是一種遵從後進先出 (LIFO / Last In First Out) 原則的有序集合,它的結構類似如下:
在這裏插入圖片描述

function Stack() {
  let items = []
  this.push = function(e) { 
    items.push(e) 
  }
  this.pop = function() { 
    return items.pop() 
  }
  this.isEmpty = function() { 
    return items.length === 0 
  }
  this.size = function() { 
    return items.length 
  }
  this.clear = function() { 
    items = [] 
  }
}

查找: 從棧頭開始查找,時間複雜度爲 O(n);

插入或刪除: 進棧與出棧的時間複雜度爲 O(1);


(4)調用棧

調用棧是 JavaScript 用來管理函數執行上下文的一種數據結構,它記錄了當前函數執行的位置,哪個函數正在被執行。 如果我們執行一個函數,就會爲函數創建執行上下文並放入棧頂。 如果我們從函數返回,就將它的執行上下文從棧頂彈出。 也可以說調用棧是用來管理這種執行上下文的棧,或稱執行上下文棧(執行棧)。


(5)棧空間與堆空間
在這裏插入圖片描述


(6)最小棧(包含getMin函數的棧)
在這裏插入圖片描述

在常數時間內檢索到最小元素的棧,即僅需保證 getMin 的時間複雜度爲 O(1) 即可

var MinStack = function() {
    this.items = []
    this.min = null
};

// 進棧
MinStack.prototype.push = function(x) {
    if(!this.items.length) this.min = x 
    this.min = Math.min(x, this.min)
    this.items.push(x) 
};

// 出棧
MinStack.prototype.pop = function() {
    let num = this.items.pop() 
    this.min = Math.min(...this.items)
    return num
};

// 獲取棧頂元素
MinStack.prototype.top = function() {
    if(!this.items.length) return null
    return this.items[this.items.length -1] 
};

// 檢索棧中的最小元素
MinStack.prototype.getMin = function() {
    return this.min
};

(7)有效的括號
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

var isValid = function(s) {
    let map = {
        '{': '}',
        '(': ')',
        '[': ']'
    }
    let stack = []
    for(let i = 0; i < s.length ; i++) {
        if(map[s[i]]) {
            stack.push(s[i])
        } else if(s[i] !== map[stack.pop()]){
            return false
        }
    }
    return stack.length === 0
};

(8)刪除字符串中的所有相鄰重複項
在這裏插入圖片描述
事例:

輸入:"abbaca"
輸出:"ca"
解釋:
例如,在 "abbaca" 中,我們可以刪除 "bb" 由於兩字母相鄰且相同,這是此時唯一可以執行刪除操作的重複項。之後我們得到字符串 "aaca",其中又只有 "aa" 可以執行重複項刪除操作,所以最後的字符串爲 "ca"

小前提:

  1. 0<= S.length <= 20000
  2. S 僅由小寫英文字母組成
    S代表該字符串

在這裏插入圖片描述

var removeDuplicates = function(S) {
    let stack = []
    for(c of S) {
        let prev = stack.pop()
        if(prev !== c) {
            stack.push(prev)
            stack.push(c)
        }
    }
    return stack.join('')
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章