算法面试题整理
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中
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
'''模拟 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即可 '''