那些测试面试中常被问到的算法题

下文是我面试过程中遇到的算法题,可以给大家做个参考,如果有其他常见算法题可以评论下来,我会及时补充更新.

class Test:
    arr = [7, 11, 2, 13, 4, 32, 12, 1, 3, 5, 66, 37, 8, 6]
    s = '1213asdasd1123ssaaa'

    def case1(self):
        # 冒泡排序
        pass

    def case2(self):
        # 二分之一查找
        pass

    def case3(self):
        # 找出列表里那两个值相加=k,打印下标
        pass

    def case4(self):
        # 判断是否是回文
        pass

    def case5(self):
        # 找出字符串中重复的字符串,并记录重复的次数
        pass

    def case6(self):
        # 找出字符串中重复的字符串,并记录重复的次数
        pass

    def case7(self):
        # 随机去掉列表里任意一个数字,打印出去掉了几个,去掉的是什么
        pass

    def case8(self):
        # 取出任意一个数,拼接上5,把5拼接到那个位置得到的数最大
        pass


    def case9(self):
        # 两个列表下标的值相加,生成一个新的列表,下标不足的保留原来的值
        pass

    def case10(self):
        # 替换字符串里的任意字符为指定的值
        pass


    def case11(self):
        # 替换列表里的值
        pass


    def case12(self):
        # 微信红包
        import random
        pass


    def case13(self):
        # 九九乘法表
        pass

    def case14(self):
        # 打印出1234中互不相同切无重复的三位数
        import itertools
        pass

    def case15(self):
        # 给你一个字符串 `date` ,按 `YYYY-MM-DD` ,返回该日期是当年的第几天。
        pass


if __name__ == '__main__':
    t = Test()
    t.case11()

冒泡排序

def case1():
    arr = [11, 2, 13, 32, 12, 1, 5, 66, 37, 8]
    for i in range(len(arr)):
        for j in range(len(arr)-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    print(arr)

二分之一查找

def case2():
    arr = [1,2,3,5,8,11,12,17,22,25,30]  # 生成列表
    j = 30
    low = 0
    high = len(arr) -1

    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == j:
            print(mid)
            return
        elif arr[mid] > j:
            high = mid -1
        else:
            low = mid +1
    print('没有找到')

找出列表里那两个值相加=k,打印下标

def case3():
    arr = [1, 7, 5, 22, 13, 8, 4, 6, 2, 3, 8, 10, 0]
    k = 7
    for i in range(len(arr)):
        for j in range(i+1,len(arr)):
            if arr[i] + arr[j] == k:
                print(i,j)

判断是否是回文

def case4(x):
    if str(x)[::-1] == str(x):
        print('yes')
    else:
        print('no')

找出字符串中重复的字符串,并记录重复的次数

def case5():
    s = "adaaaadd11111"
    ss = list(set(s))  # 获取一个无序的集合,再转成列表
    ss.sort(key=s.index)  # 给列表排序
    for i in ss:
        k = s.count(i)   # 找到重复的记录重复次数
        print(i,k)

找出字符串中重复的字符串,并记录重复的次数

def case6():
    # 字符串去重
    s = "adaaaadd11111"
    s1 = ''
    for i in range(len(s)):
        if s[i] not in s1:
            s1 += s[i]

    # 拿到去重的字符串计算出现的次数
    for i in s1:
        k = s.count(i)
        print(i,k)

随机去掉列表里任意一个数字,打印出去掉了几个,去掉的是什么

def case7():
    arr1 = [99, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    # arr2 = lambda : [x for x in arr1 if x % 2 == 0]  # 去掉无法被2整除的数
    arr2 = lambda : [x for x in arr1 if x > 10]  # 去掉小于10的数

    arr3 = []
    for i in arr1:
        if i not in arr2():
            arr3.append(i)
    print('去掉了{}个.去掉的是{}'.format(len(arr3), arr3))

取出任意一个数,拼接上5,把5拼接到那个位置得到的数最大

def case8():
    i = -1516
    key = list(str(abs(i)))
    list2 = []
    for i in range(len(key)+1):
        list1 = key.copy()
        list1.insert(i, '5')
        s = ''.join(list1)
        list2.append(int(s))
    if i < 0:
        print(max(list2))
    else:
        print(-min(list2))

两个列表下标的值相加,生成一个新的列表,下标不足的保留原来的值

def case9():
    import numpy
    list1 = [1, 3, 5, 7, 11, 13, 11, 1, 1, 2]
    list2 = [2, 4, 6, 8, 10]

    key = len(list1) - len(list2)
    list2 = numpy.pad(list2, (0, key))
    s = list(map(lambda x, y:x + y, list1, list2))
    print(s)

替换字符串里的任意字符为指定的值

def case10():
    str1 = 'aaaccnbabc'
    print(str1.replace('a', '*'))

替换列表里的值

def case11():
    list1 = ['a', 'a', 'a', 'c', 'c', 'n', 'b', 'a', 'b', 'c']
    while 'a' in list1:
        i = list1.index('a')
        list1[i] = '*'
    print(list1)

微信红包

import random
def case12(money, nums=10):
    money *= 100
    list1 = []
    for i in range(nums-1, -1, -1):
        key = money-(i+1)  # 保证后面最少能拿到0.01
        ren = random.randint(1, key)  # 随机整数,避免小数因精度问题导致数值有极小的差异
        money = money - ren
        list1.append(ren / 100)
    list1.append(money/100)
    print(list1)
    print('手气最佳:',max(list1))

九九乘法表

    def case13(self):
        for i in range(1, 10):
            for j in range(1, i+1):
                print('{}*{}={}'.format(j, i, i*j), end=' ')
            print()

打印出1,2,3,4互不相同切无重复的三位数字

例如: 123 132 134

    def case14(self):
        # 打印出1234中互不相同切无重复的三位数
        import itertools
        s = 1234
        list1 = list(str(s))
        print(list1)
        for i in range(len(list1)):
            copy_list = list1.copy()
            copy_list.pop(i)
            print(copy_list)
            list2 = []
            list2.extend(itertools.permutations(copy_list, 3))
            print('list2:', list2)

给你一个字符串date,按YYYY-MM-DD,返回该日期是当年的第几天。

def case15(date:  str) -> int:
    year, month, day = [int(x) for x in date.split("-")]

    amount = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
        amount[1] += 1

    ans = sum(amount[:month - 1])
    print(ans + day)
    return ans + day

你可能感兴趣的:(那些测试面试中常被问到的算法题)