栈与归并算法应用【2020年Python实习岗位-算法题】

一、栈结构题

  1. 输入:一个字符串,元素由小写字母组成
  2. 输出:要求去除字符串中所有的“b”和“ac”字母组合,即输出的结果中不包含“b”和“ac”

采用栈:O(n)实现

  1. 思路: 使用list的pop()方法,从尾部弹出每一个字符,将非过滤的字符增加新的列表中。但当遇到b字符时,继续弹出下一个,另外如果遇到’c’时,则多一次弹出,判断两个次弹出的内容是否为’ac’, 如果是则继续弹出。
  2. 代码内容如下:
s1 = 'goodbye disen! back see you !'
s1_list = list(s1)
new_str = []

while len(s1_list) > 0:
    c = s1_list.pop()
    if c == 'b':
        continue
    elif c == 'c':
        c2 = s1_list.pop() if len(s1_list) > 0 else ''
        if c2 != 'a':
            new_str.insert(0, c)

            if c2 != '':
                new_str.insert(0, c2)
    else:
        new_str.insert(0, c)

print(''.join(new_str))

结果是:

goodye disen!k see you !

二、归并排序与去重

  1. 输入:一个数组,元素由正整数组成,特点是开始递增,然后递减
  2. 输出:要求排序和去重

要求使用 归并算法

  1. 思路: 归并算法是分治算法思想的一种,其核心思想是将一个大的数组从中间拆分左右两个数组,并将这两个数组再分别拆分,依次类推,直到数组只有一个元素时返回, 对返回数组按先小后大的顺序合并一块。
  2. 代码如下:
def merge(arr_left, arr_right):
    c = []  # 归并的结果
    i = j = 0

    # 从小到大排序
    while i < len(arr_left) and j < len(arr_right):
        if arr_left[i] < arr_right[j]:
            # 去重条件
            if arr_left[i] not in c:
                c.append(arr_left[i])
            i += 1
        else:
            # 去重条件
            if arr_right[j] not in c:
                c.append(arr_right[j])
            j += 1

    # 确定左边是否已比较完
    # 如果左边全部比较完(都是小的), 将右边剩余的数据增加到列表中
    # 反之,将左边的数据增加到列表中
    if i == len(arr_left):
        # c.extend(arr_right[j:])
        for k in arr_right[j:]:
            if k not in c:
                c.append(k)
    else:
        # c.extend(arr_left[i:])
        for k in arr_left[i:]:
            if k not in c:
                c.append(k)

    return c


def merge_sorted(arr):
    if len(arr) <= 1:
        return arr

    middle = len(arr) // 2
    arr_left = merge_sorted(arr[:middle])
    arr_right = merge_sorted(arr[middle:])

    return merge(arr_left, arr_right)

测试代码如下:

arr = [8, 2, 1, 4, 2, 8, 6, 1, 4, 5, 7]
print(merge_sorted(arr))

结果如下:

[1, 2, 4, 5, 6, 7, 8]

你可能感兴趣的:(数据结构与算法)