..

那些年 用python刷过的面试算法题

准备面试的过程中用Python写了一些的算法题, 用这篇日志记录一下.

##fibonacci数组:
/blog/20160915/dynamic-programming/

##Generating all possible permutations of a list 生成一个列表的所有组合.
1.The feeling of completing an algorithm with only one error, awesome.

def permutation(ABC, len_fix):
    if len_fix == len(ABC)-1:
        print(ABC)
    else:
        for i in range(len(ABC)-len_fix):
            part1, part2 = ABC[:len_fix], ABC[len_fix:]
            part2[i], part2[0] = part2[0], part2[i]
            permutation(part1+part2, len_fix+1)

ABC = [0, 1, 2, 3]
permutation(ABC, 0)

2.Python buildin method:

>>> horses = [1, 2, 3, 4]
>>> races = itertools.permutations(horses)
>>> print(races)
<itertools.permutations object at 0xb754f1dc>
>>> print(list(itertools.permutations(horses)))
[(1, 2, 3, 4),
 (1, 2, 4, 3),
...
 (4, 3, 1, 2),
 (4, 3, 2, 1)]

本来是想刷一遍leecode, 但算法题有四百多题..刷了三四题就放弃了
接下来的一些算法题是剑指offer里的: https://www.nowcoder.com/ta/coding-interviews?query=&asc=false&order=submissionCount&page=1

输入一个链表,从尾到头打印链表每个节点的值.

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    # 返回从尾部到头部的列表值序列,例如[1,2,3]
    def printListFromTailToHead(self, listNode):
        # write code here

        if listNode is None:
            return []
        else:
            result = [listNode.val]

        while listNode.next:
            result.append(listNode.next.val)
            listNode = listNode.next

    	return result[::-1]

反转链表

# -*- coding:utf-8 -*-
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def ReverseList(self, pHead):
        if pHead is None or pHead.next is None:
            return pHead

        h = self.ReverseList(pHead.next)

        # reverse the linked list, except last one(because of return).
        pHead.next.next = pHead
        # head set null
        pHead.next = None

        return h

合并两个有序的链表

class Solution:
    def Merge(self, pHead1, pHead2):
        if pHead1 is None: return pHead2
        if pHead2 is None: return pHead1

        if pHead1.val < pHead2.val:
            pHead1.next = self.Merge(pHead1.next, pHead2)
            head = pHead1
        else:
            pHead2.next = self.Merge(pHead1, pHead2.next)
            head = pHead2

        return head

生成二叉树的镜像

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None


class Solution:
    # 返回镜像树的根节点
    def Mirror(self, root):

        if root:
            root.left, root.right = self.Mirror(root.right), self.Mirror(root.left)

        return root

输入两棵二叉树A,B,判断B是不是A的子结构。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None


class Solution:
    def HasSubtree(self, pRoot1, pRoot2):
        if pRoot1 is None or pRoot2 is None:
            return False
        elif self.is_subtree(pRoot1, pRoot2):
            return True
        else:
            return self.HasSubtree(pRoot1.left, pRoot2) or self.HasSubtree(pRoot1.right, pRoot2)

    def is_subtree(self, pRoot1, pRoot2):
        if pRoot2 is None:
            return True

        elif pRoot1 and pRoot2 and pRoot1.val == pRoot2.val:
            return self.is_subtree(pRoot1.left, pRoot2.left) and self.is_subtree(pRoot1.right, pRoot2.right)
        else:
            return False


# t1 = TreeNode(1)
# t1.left = TreeNode(1)
# t1.left.right = TreeNode(3)
# t1.left.left = TreeNode(2)
#
#
# t2 = TreeNode(1)
# t2.left = TreeNode(2)
# t2.right = TreeNode(3)
# # t2.left.left = TreeNode(4)
#
#
# print(Solution().is_sametree(t1, t2))
# print(Solution().HasSubtree(t1, t2))

一层一层打印二叉树

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None


class Solution:
    # 返回从上到下每个节点值列表,例:[1,2,3]
    def PrintFromTopToBottom(self, root):
        result = []

        nodes_in_level = [root] if root else []
        while nodes_in_level:
            nodes_in_next_level = []
            for node in nodes_in_level:
                result.append(node.val)
                nodes_in_next_level.append(node.left)
                nodes_in_next_level.append(node.right)

            nodes_in_level = [node for node in nodes_in_next_level if node]

        return result



# t1 = TreeNode(1)
# t1.left = TreeNode(1)
# t1.left.right = TreeNode(3)
# t1.left.left = TreeNode(2)
#
# print(Solution().PrintFromTopToBottom(t1))

栈的压入弹出序列

# -*- coding:utf-8 -*-

# 输入两个整数序列,第一个序列表示栈的压入顺序, 请判断第二个序列是否为该栈的弹出顺序。
# 假设压入栈的所有数字均不相等。
# 例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

class Solution:
    def IsPopOrder(self, pushV, popV):
        if pushV and popV and set(pushV) == set(popV):
            l = [pushV.pop(0)]

            while popV:
                # False
                if popV[0] in l[:-1]:
                    return False

                # 1. push
                elif pushV and l[-1] != popV[0]:
                    l.append(pushV.pop(0))

                # 2. pull
                else:
                    l.pop()
                    popV.pop(0)

            return True
        else:
            return False