zoukankan      html  css  js  c++  java
  • interview prepare_que&stk

    1. implement stack use two queues.

     1 #coding:utf-8
     2 class MyStack:
     3     def __init__(self):
     4         self.que1=[]
     5         self.que2=[]
     6        
     7     def push(self,val):
     8         #始终插入que1
     9         self.que1.append(val)
    10         
    11     
    12     def pop(self):
    13         if(len(self.que1)==0):
    14             raise("Empty stack!")
    15         while(len(self.que1)>1):
    16             self.que2.append(self.que1.pop(0))
    17         
    18         res=self.que1.pop(0)
    19         
    20         while(len(self.que2)>0):
    21             self.que1.append(self.que2.pop(0))
    22 
    23         return res
    24 
    25 
    26 stack=MyStack()
    27 stack.push(1)
    28 stack.push(2)
    29 print(stack.pop())
    30 stack.push(4)
    31 stack.push(5)
    32 print(stack.pop())
    33 print(stack.pop())
    34 print(stack.pop())
    35 print(stack.pop())

    2. implement que use two stacks.

     1 class MyQueue:
     2     def __init__(self):
     3         self.stack1=[]    
     4         self.stack2=[]
     5 
     6     def push(self,val):
     7         self.stack1.append(val)
     8     
     9     def pop(self):
    10         if(len(self.stack1)==0):
    11             raise("Empty que!")
    12         
    13         while(len(self.stack1)>1):
    14             self.stack2.append(self.stack1.pop())    
    15         res=self.stack1.pop()
    16         while(len(self.stack2)>0):
    17             self.stack1.append(self.stack2.pop())
    18         return res
    19 
    20 que=MyQueue()
    21 que.push(1)
    22 que.push(2)
    23 print(que.pop())
    24 que.push(3)
    25 que.push(4)
    26 print(que.pop())
    27 print(que.pop())
    28 print(que.pop())
    29 print(que.pop())

    3. min_stack

     1 class MinStack:
     2     def __init__(self):
     3         self.stack=[]
     4         self.minstk=[]
     5     
     6     def push(self,x):
     7         if(len(self.stack)==0):
     8             self.stack.append(x)
     9             self.minstk.append(x)
    10         
    11         tmp=min(self.minstk[-1],x)
    12         self.stack.append(x)
    13         self.minstk.append(tmp)
    14     
    15     def pop(self):
    16         if(len(self.stack)==0):
    17             raise("Empty stack!")
    18         
    19         self.minstk.pop()
    20         return self.stack.pop()
    21 
    22     def get_min(self):
    23         return self.minstk[-1]
    24 
    25 
    26 st=MinStack()
    27 st.push(-2)
    28 print(st.get_min())
    29 st.push(0)
    30 print(st.get_min())
    31 st.push(-5)
    32 print(st.get_min())
    33 print("pop:",st.pop())
    34 print(st.get_min())

    4. valid pop_seq

    class Solution:
        def __init__(self):
            pass
        
        def is_valid(self,push_seq,pop_seq):
            self.push_st=[]
            for i in range(len(push_seq)):
                self.push_st.append(push_seq[i])
                while(len(self.push_st) and self.push_st[-1]==pop_seq[0]):
                    self.push_st.pop()
                    pop_seq.pop(0)
    
            return len(self.push_st)==0
    
    s=Solution()
    push_seq=[1,2,3,4,5]
    pop1=[3,2,5,4,1]
    print(s.is_valid(push_seq,pop1))
    
    
    pop2=[3,1,2,4,5]
    print(s.is_valid(push_seq,pop2))        

    5. simple cal

     1 class Solution:
     2     BEGIN_STATE=0
     3     NUMBER_STATE=1   
     4     OP_STATE=2
     5 
     6     def calculate(self,s):
     7         self.number_st=[]
     8         self.op_st=[]
     9         
    10         num=0;
    11         state=BEGIN_STATE
    12         compute_flag=0
    13         
    14         for u in range(len(s)):
    15             if(s[i]==' '):
    16                 continue
    17             if state==BEGIN_STATE:
    18                  if(s[i]>='0' and s[i]<='9'):
    19                      state=NUMBER_STATE
    20                  else:
    21                      state=OP_STATE
    22                  i-=1
    23             elif state==NUMBER_STATE:
    24                 if(0<=int(s[i]<=9)):
    25                     number=number*10+int(s[i])
    26                 else:
    27                     self.number_st.append(number)
    28                     if(compute_flag==1):
    29                         right,left=self.number_st.pop(),self.number_st.pop()
    30                         res=left+right if(self.op.pop()=="+") else left-right
    31                         self.number_st.append(res)
    32                     number=0
    33                     i-=1
    34                     state=OP_STATE
    35             elif state==OP_STATE:
    36                 if(s[i]=="+" or s[i]=="-"):
    37                     self.op_st.append(s[i])
    38                     compute_flag=1
    39                 elif s[i]=='(':
    40                     state=NUMBER_STATE
    41                     compute_flag=0
    42                 elif (0<=int(s[i]<=9)):
    43                     state=NUMBER_STATE
    44                     i-=1
    45                 elif s[i]==')':
    46                     right,left=self.number_st.pop(),self.number_st.pop()
    47                     res=left+right if(self.op.pop()=="+") else left-right
    48                     self.number_st.append(res)
    49             if number!=0:
    50                 self.number_st.append(number)
    51                 right,left=self.number_st.pop(),self.number_st.pop()
    52                 res=left+right if(self.op.pop()=="+") else left-right
    53                 self.number_st.append(res)
    54 
    55             if(number==0 and len(self.number_st)==0):
    56                 return 0
    57             
    58             return self.number_st[0]
    View Code

    6. topK

    python中堆和优先队列(均是小顶堆)的使用:

    优先队列(本身带有存储容器)

    from queue import PriorityQueue
    #向队列中添加元素
    Queue.put(item[, block[, timeout]])
    #从队列中获取元素
    Queue.get([block[, timeout]])
    #队列判空
    Queue.empty()
    #队列大小
    Queue.qsize()

    堆(本身不带存储容器,只是定义了一组对容器进行堆相关操作的函数)

    1 from heapq import *
    2 heap = []            # creates an empty heap
    3 heappush(heap, item) # pushes a new item on the heap
    4 item = heappop(heap) # pops the smallest item from the heap
    5 item = heap[0]       # smallest item on the heap without popping it
    6 heapify(x)           # transforms list into a heap, in-place, in linear time
    7 item = heapreplace(heap, item) # pops and returns smallest item, and adds
    8                                # new item; the heap size is unchanged

    topK实现:维持一个k大小的小顶堆

     1 from heapq import *
     2 
     3 def get_topK(nums,k):
     4     hq=nums[:k]
     5     heapify(hq)
     6     
     7     for i in range(k,len(nums)):
     8         if(nums[i]>hq[0]):
     9             heappop(hq)
    10             heappush(hq,nums[i])
    11 
    12     return hq[0]
    13 
    14 nums=[1,5,9,-2,55,77,2]
    15 print(get_topK(nums,2))

    7. median in data stream

    from heapq import *
    
    class Solution:
        def __init__(self):
            self.leftq=[]
            self.rightq=[]
        
        def add(self,x):
            heappush(self.leftq,-x)
            if(len(self.leftq)!=0):
                heappush(self.rightq,-heappop(self.leftq))
            if( len(self.rightq)-len(self.leftq)>0 ):
                heappush(self.leftq,-heappop(self.rightq))
        def get_median(self):
            if((len(self.leftq)+len(self.rightq))&1==1):
                return -self.leftq[0]
            else:
                return (-self.leftq[0]+self.rightq[0])/2.0
    
    s=Solution()
    s.add(1)
    print(s.get_median())
    s.add(2)
    print(s.get_median())
    s.add(3)
    print(s.get_median())
    s.add(4)
    print(s.get_median())
  • 相关阅读:
    python3 TypeError: a bytes-like object is required, not 'str'
    Centos 安装Python Scrapy PhantomJS
    Linux alias
    Vim vimrc配置
    Windows下 Python Selenium PhantomJS 抓取网页并截图
    Linux sort
    Linux RSync 搭建
    SSH隧道 访问内网机
    笔记《鸟哥的Linux私房菜》7 Linux档案与目录管理
    Tornado 错误 "Global name 'memoryview' is not defined"
  • 原文地址:https://www.cnblogs.com/zijidan/p/12495524.html
Copyright © 2011-2022 走看看