zoukankan      html  css  js  c++  java
  • [Swift]LeetCode946. 验证栈序列 | Validate Stack Sequences

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10015225.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Given two sequences pushed and popped with distinct values, return true if and only if this could have been the result of a sequence of push and pop operations on an initially empty stack.

     Example 1:

    Input: pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
    Output: true
    Explanation: We might do the following sequence:
    push(1), push(2), push(3), push(4), pop() -> 4,
    push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
    

    Example 2:

    Input: pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
    Output: false
    Explanation: 1 cannot be popped before 2.
    

     Note:

    1. 0 <= pushed.length == popped.length <= 1000
    2. 0 <= pushed[i], popped[i] < 1000
    3. pushed is a permutation of popped.
    4. pushed and popped have distinct values.

    给定 pushed 和 popped 两个序列,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。

    示例 1:

    输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
    输出:true
    解释:我们可以按以下顺序执行:
    push(1), push(2), push(3), push(4), pop() -> 4,
    push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
    

    示例 2:

    输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
    输出:false
    解释:1 不能在 2 之前弹出。
    

     提示:

    1. 0 <= pushed.length == popped.length <= 1000
    2. 0 <= pushed[i], popped[i] < 1000
    3. pushed 是 popped 的排列。

    64ms
     1 class Solution {
     2     func validateStackSequences(_ pushed: [Int], _ popped: [Int]) -> Bool {
     3        var i = 0;
     4         
     5         var result = [Int]()
     6         for element in pushed {
     7             result.append(element)
     8             
     9             while !result.isEmpty && result.last! == popped[i] {
    10                 result.removeLast()
    11                 i += 1
    12             }
    13         }
    14         
    15         return result.count == 0 ? true : false
    16     }
    17 }

    68ms

     1 class Solution {
     2     func validateStackSequences(_ pushed: [Int], _ popped: [Int]) -> Bool {
     3         var pop = popped
     4         var stack: [Int] = []
     5         var pushCount = pushed.count
     6         var i = 0
     7         while !pop.isEmpty && i < pushCount {
     8             stack.append(pushed[i])
     9             i += 1
    10             while let first = pop.first, let last = stack.last, first == last {
    11                 pop.remove(at: 0)
    12                 stack.remove(at: stack.count - 1)   
    13             }
    14         }
    15         return pop.count == 0
    16         
    17     }
    18 }

    72ms
     1 class Solution {
     2     func validateStackSequences(_ pushed: [Int], _ popped: [Int]) -> Bool {
     3         var s:Stack<Int> = Stack<Int>()
     4         var j:Int = 0
     5         for i in 0..<pushed.count
     6         {
     7             s.push(pushed[i])
     8             while (!s.isEmpty() && j < popped.count && s.getLast() == popped[j])
     9             {
    10                 s.pop()
    11                 j += 1
    12             }
    13         }
    14         return s.isEmpty() && j == popped.count
    15     }
    16 }
    17 
    18 public struct Stack<T> {
    19     
    20     // 泛型数组:用于存储数据元素
    21     fileprivate var stack: [T] 
    22 
    23     // 返回堆栈中元素的个数
    24     public var count: Int {
    25         return stack.count
    26     }
    27     
    28     /// 构造函数:创建一个空的堆栈
    29     public init() {
    30         stack = [T]()
    31     }
    32     
    33     // 检查堆栈是否为空
    34     // - returns: 如果堆栈为空,则返回true,否则返回false
    35     public func isEmpty() -> Bool {
    36         return stack.isEmpty
    37     }
    38     
    39     // 入堆栈操作:将元素添加到堆栈的末尾
    40     public mutating func push(_ element: T) {
    41         stack.append(element)
    42     }
    43     
    44     // 出堆栈操作:删除并返回堆栈中的第一个元素
    45     public mutating func pop() -> T? {
    46         return stack.removeLast()
    47     }
    48  
    49     // 返回堆栈中的第一个元素(不删除)
    50     public func getLast() -> T? {
    51         return stack.last!
    52     }
    53 }

    72ms
     1 class Solution {
     2     func validateStackSequences(_ pushed: [Int], _ popped: [Int]) -> Bool {
     3         var push = pushed
     4         var pop = popped
     5         var qs = [Int]()
     6         while let u = pop.first {
     7             if let v = qs.last, v == u {
     8                 qs.removeLast()
     9                 pop.remove(at: 0)
    10                 continue
    11             }
    12             if let v = push.first, v == u {
    13                 push.remove(at: 0)
    14                 pop.remove(at: 0)
    15                 continue
    16             }
    17             guard !push.isEmpty else {
    18                 return false
    19             }
    20             let r = push.remove(at: 0)
    21             qs.append(r)
    22         }
    23         guard push.isEmpty, pop.isEmpty else {
    24             return false
    25         }
    26         return true
    27     }
    28 }

    80ms

     1 class Solution {
     2     func validateStackSequences(_ pushed: [Int], _ popped: [Int]) -> Bool {
     3         var popped = popped
     4         var stack = [Int]()
     5         for item in pushed {
     6             stack.append(item)
     7             while stack.last == popped.first && popped.first != nil {
     8                 stack.removeLast()
     9                 popped.removeFirst()
    10             }
    11         }
    12         while stack.last == popped.first && popped.first != nil {
    13             stack.removeLast()
    14             popped.removeFirst()
    15         }
    16         return stack.isEmpty
    17     }
    18 }

    92ms

     1 class Solution {
     2     func validateStackSequences(_ pushed: [Int], _ popped: [Int]) -> Bool {
     3         var currentStack: [Int] = []
     4         var nextPushIndex = 0
     5         var nextPopIndex = 0
     6         
     7         while nextPopIndex < popped.count {
     8             let poppedValue = popped[nextPopIndex]
     9             
    10             while currentStack.last != poppedValue && nextPushIndex < pushed.count {
    11                 currentStack.append(pushed[nextPushIndex])
    12                 nextPushIndex += 1
    13             }
    14             
    15             if currentStack[currentStack.count - 1] != poppedValue {
    16                 return false
    17             } else {
    18                 currentStack.removeLast()
    19             }
    20             
    21             nextPopIndex += 1
    22         }
    23         
    24         return true
    25     }
    26 }

    100ms

     1 class Solution {
     2     func validateStackSequences(_ pushed: [Int], _ popped: [Int]) -> Bool {
     3         guard pushed.count == popped.count else { return false }
     4         var st: [Int] = []
     5         
     6         var pushIt = 0
     7         var popIt = 0
     8         
     9         while pushIt < pushed.count {
    10             st.append(pushed[pushIt])
    11             //print(st, pushIt, popIt)
    12             while st.count > 0 && st[st.count - 1] == popped[popIt] {
    13                 //print("del ", st, pushIt, popIt)
    14                 st.remove(at: st.count - 1)
    15                 popIt += 1
    16             }
    17             pushIt += 1
    18         }
    19         
    20         return st.count == 0
    21     }
    22 }

    104ms

     1 class Solution {
     2     func validateStackSequences(_ pushed: [Int], _ popped: [Int]) -> Bool {
     3         if (pushed.count != popped.count) {
     4             return false
     5         } 
     6         
     7         var stack = [Int]()        
     8         var N = pushed.count
     9         var j = 0
    10         
    11         
    12         for x in pushed {
    13             stack.append(x)
    14             while(stack.count > 0 && 
    15                   j < N && 
    16                   stack.last == popped[j]) {
    17                 stack.popLast()
    18                 j += 1
    19             }
    20         }        
    21         
    22         return j == N
    23     }
    24 }
  • 相关阅读:
    内部类
    抽象类与接口
    多态
    继承
    封装
    创建对象的内存分析
    构造器
    面向对象 类与对象
    uniapp跳转
    uniapp-组件引用错误,仅支持 import 方式引入组件
  • 原文地址:https://www.cnblogs.com/strengthen/p/10015225.html
Copyright © 2011-2022 走看看