ARTS LeetCode 剑指 Offer 09:用两个栈实现队列

340 阅读1分钟

ARTS LeetCode 剑指 Offer 09:用两个栈实现队列

继续刷LeetCode,做做脑力运动,今天继续使用go来做开发,随机刷了一道编号为剑指 Offer 09的题:yong liang ge zhan shi xian dui lie lcof,中文名叫用两个栈实现队列,难度:简单。

题目有点简单了,就当熟悉go语言规范了,以后适当跳过easy难度的题,同时看看刷题策略,效率有点偏低了。

官方一共181个case,有几个就是为了测试性能的,先放一个最终结果吧

执行用时 : 284 ms, 在所有 Go 提交中击败了 19.90% 的用户 内存消耗 : 8.3 MB, 在所有 Go 提交中击败了 100.00% 的用户

详细信息参考这里 用两个栈实现队列 - 提交记录 - 力扣 (LeetCode)

执行效率不够高。

package main

type Stack []interface{}

func (stack Stack) Len() int {
	return len(stack)
}

func (stack Stack) IsEmpty() bool {
	return len(stack) == 0
}

func (stack Stack) Cap() int {
	return cap(stack)
}

func (stack *Stack) Push(value interface{}) {
	*stack = append(*stack, value)
}

func (stack Stack) Top() interface{} {
	if len(stack) == 0 {
		return nil
	}
	return stack[len(stack)-1]
}

func (stack *Stack) Pop() interface{} {
	theStack := *stack
	if len(theStack) == 0 {
		return nil
	}
	value := theStack[len(theStack)-1]
	*stack = theStack[:len(theStack)-1]
	return value
}

type CQueue struct {
	left, right Stack
}

func Constructor() CQueue {
	var q CQueue
	return q
}

func (this *CQueue) AppendTail(value int) {
	var i = this.right.Pop()
	for i != nil {
		this.left.Push(i)
		i = this.right.Pop()
	}
	this.left.Push(value)
}

func (this *CQueue) DeleteHead() int {
	var i = this.left.Pop()
	for i != nil {
		this.right.Push(i)
		i = this.left.Pop()
	}
	var result = this.right.Pop()
	if result == nil {
		return -1
	}
	return result.(int)
}

/**
 * Your CQueue object will be instantiated and called as such:
 * obj := Constructor();
 * obj.AppendTail(value);
 * param_2 := obj.DeleteHead();
 */

这个题目不太好本地试验测试用例,暂时略过。

收获

主要是语法上的学习:

  • for loop
  • type assertion
  • stack in golang

Reference