详解自动化面试常见算法题!!

本贴最后更新于 507 天前,其中的信息可能已经时过境迁

1、实现一个数字的反转,比如输入12345,输出54321

num = 12345
num_str = str(num)
reversed_num_str = num_str[::-1]
reversed_num = int(reversed_num_str)
print(reversed_num)  # 输出 54321

2、统计在一个队列中的数字,有多少个正数,多少个负数,如[1,3,5,7,0,-1,-9,-4,-5,8]

nums = [1, 3, 5, 7, 0, -1, -9, -4, -5, 8]
positive_count = 0
negative_count = 0

for num in nums:
    if num > 0:
        positive_count += 1
    elif num < 0:
        negative_count += 1

print(f"正数数量:{positive_count},负数数量:{negative_count}")

3、一个数的阶乘运算,求结果,如求5的阶乘结果。

n = 5  # 求 5 的阶乘
factorial = 1  # 阶乘的初始值为 1

for i in range(1, n+1):
    factorial *= i  # 依次乘以 1, 2, 3, ..., n

print(factorial)  # 输出 120

4、1加到N的阶层之和,比如N=4, result = (1! + 2! + 3! + 4!)

n = 4
factorial_sum = 0  # 1到N的阶层之和
result = 0  # 最终的结果

# 循环计算1到N的阶层之和
for i in range(1, n+1):
    factorial = 1  # 用来记录i的阶层
    for j in range(1, i+1):
        factorial *= j
    factorial_sum += factorial

# 累加到结果中
result += factorial_sum

print(result)  # 输出 33

5、求出1000以内的完全数

for n in range(2, 1001):
    factors = []  # 用来存储n的因子
    for i in range(1, n):
        if n % i == 0:
            factors.append(i)  # 将i加入到n的因子列表中

    if sum(factors) == n:
        print(n)

6、求出1000以内的水仙花数

for n in range(100, 1000):
    # 将 n 的每一位取出来,计算它们的立方和
    digits = [int(d) for d in str(n)]
    digit_cubes_sum = sum(d ** 3 for d in digits)

    # 如果立方和等于 n,则说明这是一个水仙花数
    if digit_cubes_sum == n:
        print(n)

7、求出1000以内的回文数

for n in range(100, 1000):
    # 将 n 转换为字符串,并将字符串反转后再转成数字
    reversed_n = int(str(n)[::-1])

    # 如果翻转后的数等于 n,则说明 n 是一个回文数
    if reversed_n == n:
        print(n)

8、实现一个数字的斐波那契数列

# 方式一:循环实现
def fib(n):
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    return a
# 测试代码
n = 10
print([fib(i) for i in range(n)])  # 输出结果为 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

# 方式二:递归实现
def fib(n):
    if n <= 1:
        return n
    else:
        return fib(n-1) + fib(n-2)
# 测试代码
n = 10
print([fib(i) for i in range(n)])  # 输出结果为 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

9、统计列表1~9999中包含3的元素的总个数

import re

# 方式一:循环实现
count = 0

# 遍历 1~9999 中的每个数字,将数字转换成字符串并查找其中是否包含字符 3
for i in range(1, 10000):
    if '3' in str(i):
        count += 1

print(count)  # 输出结果为 3439

# 方式二:循环+正则匹配实现
theList = list(filter(lambda x: re.match('(.*?)3(.*?)',str(x)) ,a))
print(f"列表[1~9999]中包含3的元素总个数为:{len(theList)}") # 输出结果为 3439

代码解析:

10、写一个冒泡排序的算法程序

def bubble_sort(arr):
    n = len(arr)
    # 遍历 n 次
    for i in range(n):
        # 第 i 次遍历,找出未排序部分的最大元素并将其放到末尾
        for j in range(n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
            
# 测试代码            
arr = [5, 2, 8, 4, 1]
bubble_sort(arr)
print(arr)  # 输出结果为 [1, 2, 4, 5, 8]

11、用python实现二分法排序

def binary_search(arr, target):
    low, high = 0, len(arr) - 1

    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1

    return -1

# 测试代码
arr = [1, 3, 4, 6, 8, 9, 11, 12, 13, 16]
target = 9
pos = binary_search(arr, target)
if pos == -1:
    print("元素不在列表中")
else:
    print("元素在列表中的下标为:", pos)

12、写一个快排的算法程序

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]  # 选择中间的元素作为基准值
    left = [x for x in arr if x < pivot]  # 小于基准值的放在左边
    mid = [x for x in arr if x == pivot]  # 等于基准值的放在中间
    right = [x for x in arr if x > pivot]  # 大于基准值的放在右边
    return quick_sort(left) + mid + quick_sort(right)

# 测试代码
arr = [5, 2, 8, 4, 1]
arr_sorted = quick_sort(arr)
print(arr_sorted)  # 输出结果为 [1, 2, 4, 5, 8]
1 操作
lemonkemi 在 2023-06-26 16:09:55 更新了该帖
回帖
请输入回帖内容 ...