算法面试题整理

 1、python反转字符串

'''第一种:使用字符串切片'''
s = 'Hello World'
print(s[::-1])  # dlroW olleH

'''第二种:使用列表的reverse方法'''
l = list(s)
l.reverse()
print( "".join(l) )   # dlroW olleH

'''第三种:使用reduce'''
from functools import reduce
result = reduce(lambda x,y:y+x,s)
print( result )      # dlroW olleH

2. 用两个栈实现一个队列

    注:栈后进先出,列表先进先出, 使用两个栈模拟列队列未被插入元素和删除队列头

  1、实现方法

    1)使用stack1模拟队列尾部追加元素

        1. 只要追加元素直接加入stack1这个栈即可

    2)使用stack2模拟删除队首元素

        1. 当第一次删除时,stack2肯定为空,那么将stack1中元素依次出栈,加入stack2中

        2. 那么stack2中栈顶元素即是stack1中以前的栈底元素(队列头),stack1为空

        3. 当第二次删除时首先会判断stack2是否为空,如果不为空,直接删除stack2的栈顶元素即为队列头部元素

        4. 如果stack2为空,再次将stack1中元素依次加入stack2中

class CQueue:
    def __init__(self):
        self.stack1 = []
        self.stack2 = []

    def append_tail(self, elem):
        self.stack1.append(elem)

    def delete_head(self):
        if not self.stack2:  # 如果stack2为空就将stack1中的元素依次如stack2的栈,stack2就可以模拟这个列表了
            if self.stack1:
                while self.stack1:
                    elem = self.stack1.pop()
                    self.stack2.append(elem)
            else:
                raise Exception("Queue is empty.")
        elem = self.stack2.pop()  # 只要stack2不为空,stack2栈顶元素即是队首元素
        return elem


if __name__ == '__main__':
    que = CQueue()
    que.append_tail(1)
    que.append_tail(2)
    que.append_tail(3)
    print que.delete_head()  # 1
    que.append_tail(4)
'''模拟 1 2 3 加入对了,然后3出对了,然后4加入队列过程'''
# 第一步:1 2 3 加入队列
'''
stack1 = [1,2,3]
'''

# 第二步:删除队列头部元素
'''
1) 将stack1中元素依次出栈放入stack2中
stack1 = []
stack2 = [3,2,1]
删除队列首部元素即删除stack2栈顶元素: stack2 = [3,2]
'''

# 第三步:将4加入队列
'''
stack1 = [4]
stack2 = [3,2]
# 如果再次删除队列头部,就直接删除stack2栈顶元素,直到stack2为空,再次将stack1中元素出栈放入stack2即可
'''

 

3.使用yield生成器生成斐波拉契函数

def fib(max_num):
    a,b = 1,1
    while a < max_num:
        yield b
        a,b=b,a+b

g = fib(10)               #生成一个生成器:[1,2, 3, 5, 8, 13]
print(g.__next__())       #第一次调用返回:1
print(list(g))            #把剩下元素变成列表:[2, 3, 5, 8, 13]

 

复制代码
'''模拟 1 2 3 加入对了,然后3出对了,然后4加入队列过程'''
# 第一步:1 2 3 加入队列
'''
stack1 = [1,2,3]
'''

# 第二步:删除队列头部元素
'''
1) 将stack1中元素依次出栈放入stack2中
stack1 = []
stack2 = [3,2,1]
删除队列首部元素即删除stack2栈顶元素: stack2 = [3,2]
'''

# 第三步:将4加入队列
'''
stack1 = [4]
stack2 = [3,2]
# 如果再次删除队列头部,就直接删除stack2栈顶元素,直到stack2为空,再次将stack1中元素出栈放入stack2即可
'''
posted @ 2020-07-06 10:18  Guohd  阅读(138)  评论(0编辑  收藏  举报