生若直木,不语斧凿.

面试题目

Posted on By xiaoyongsheng
Email: xiaoyongsheng@hotmail.com
Views:

0626

上台阶

一个楼梯共有n阶,每次只能上一阶或者两阶,问共有多少种方式走完整段楼梯?

  • 解题思路
    这是一个递归的思路,因为当剩余台阶大于等于2阶时,都会面临两个选择:下1阶或者2阶,代码如下:
def upstairs(n):
    if n > 0:
        print('steps:{0}\tposibilities:{1}'.format(n, step(n)))
    else:
        print('sorry! illegal input!')


def step(n):
    """step by step like the pace of the devil.

    Params:
        n:   total steps.

    Return:
        count of posibilities.
    """
    if n == 2:
        return 2
    elif n == 1:
        return 1
    elif n == 0:
        return 0
    elif n > 2:
        return step(n-1) + step(n-2)

if __name__ == '__main__':
    for i in range(10):
        upstairs(i)
  • 原始思路
    很少面试,也很少涉及面试的时候写代码这种事情,所以,当时思路是这样的:

将本题转换为数学题:

其中,a代表了下1阶台阶的次数,b代表了下2阶台阶的次数,n代表台阶总数;
在给定n的情况下,会有多组(a,b)的值,(a,b)的个数就是本题“组合”数; 而具体有多少种方案就是各个“组合”的“排列”值的总和;

这样实现起来的时候首先需要求多组(a,b),然后把a个1,b个2转换为list,再求每个list所有的可能“排列”,计算复杂,占用空间巨大,扯到蛋了。

0705

判断二叉搜索树

本题是在Boss直聘看到的,有家创业公司(小库科技, 建筑AI)直接把题目贴出来,说有答案请联系我,还挺有个性的。

以复杂度O(n)判定一棵树是否为二叉搜索树。

  • 原始思路
    首先,既然要判定是否是二叉搜索树,我得先构造一棵树,所以第一步要学学如何构造二叉树,然后再去琢磨如何判定。

def isbst(node, min, max):
    if node is None:
        return True
    return isbst(left_node, min, node) && isbst(right_node, node, max)

0712

字典排序

给定一组dict, 其中key是str类型, value是float型,请根据value的大小对key进行排序

  • 原始思路 将key和value拆分为两个list,对list进行排序,排序进行的同时对key进行排序:

    • 首先实现排序算法,以快排为例:
    def qs(input_list):
        return quick_sort(input_list, 0, len(input_list)-1)
    
    def quick_sort(lst, left, right):
        if left >= right:
            return lst
        else:
            key = left
            lp = left
            rp = right
            while lp < rp:
                while lst[rp] >= lst[key] and lp < rp:
                    rp = rp - 1
                while lst[lp] <= lst[key] and lp < rp:
                    lp = lp + 1
                print(lst, lp, rp, key)
                lst[lp], lst[rp] = lst[rp], lst[lp]
            lst[left], lst[lp] = lst[lp], lst[left]
            lst = quick_sort(lst, left, lp)
            lst = quick_sort(lst, rp+1, right)
            return lst
    
    • 其次,按照原本思路,根据key值或者value值对dict items进行排序:
    def qs_dict(input_dict, rv=False):
        return dict_quick_sort(input_dict.items(), 0, len(input_dict)-1, rv=rv)
    
    def dict_quick_sort(lst_dict, left, right, rv=False):
        """ if rv = False, output items ordered with key;
        if rv = True, return items ordered with values;
        """
        if left >= right:
            return lst_dict
        elif rv == True:
            lst = [j for i,j in lst_dict]
        else:
            lst = [i for i,j in lst_dict]
        key = left
        lp = left
        rp = right
        while lp < rp:
            while lst[rp] >= lst[key] and lp < rp:
                rp = rp - 1
            while lst[lp] <= lst[key] and lp < rp:
                lp = lp + 1
            print(lst_dict, lp, rp, key)
            lst_dict[lp], lst_dict[rp] = lst_dict[rp], lst_dict[lp]
        lst_dict[left], lst_dict[lp] = lst_dict[lp], lst_dict[left]
        lst_dict = dict_quick_sort(lst_dict, left, lp, rv=rv)
        lst_dict = dict_quick_sort(lst_dict, rp+1, right, rv=rv)
        return lst_dict
    
  • 反思

    其实,最开始的想法是dict自己有没有类似这种排序方法, 可惜好像并没有, 但是意外之喜是python内建函数sorted其实可以简单的实现这个功能:

    sorted(input_dict.items(), key = lambda d: d[0])  # 按照key进行排序
    sorted(input_dict.items(), key = lambda d: d[1])  # 按照value进行排序