天天看點

自動化面試常見算法題!

作者:程式員月下
自動化面試常見算法題!

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}")
           
  • 代碼解析:首先定義了一個數字清單 nums,然後用變量 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
           
  • 代碼解析:首先定義了待求階乘的數 n,然後将階乘的初始值設為 1。在循環中,使用 range(1, n+1) 來周遊 1 到 n 這n個數的值。對于每個數,用 factorial 依次乘以它,最終得到的結果即為階乘。最後輸出結果

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
           
  • 代碼解析:首先定義了待求解的數 n 和計算 1 到 N 的階層之和的變量 factorial_sum。在循環中,使用兩層嵌套循環來計算 i 的階層,然後把所有階層求和得到 factorial_sum。最後将 factorial_sum 加入到最終結果 result 中。最後輸出結果。

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)
           
  • 代碼解析:外層循環 for n in range(2, 1001) 周遊所有可能的完全數,即從2到1000。在内層循環 for i in range(1, n) 中,使用 n % i == 0 來判斷i是否是n的因子,如果是則将它加入到因子清單 factors 中。在循環結束後,使用 sum(factors) == n 來判斷所有因子的和是否等于n,如果是則說明n是完全數,輸出它的值即可。
  • 完全數是指除自身外所有因子之和等于自身的數。其中最經典的兩個完全數是6和28,它們的因子分别是1, 2, 3和1, 2, 4, 7, 14。

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)
           
  • 代碼解析:外層循環 for n in range(100, 1000) 周遊所有三位數,内層使用了清單推導式和 sum() 函數來計算 n 的每個數字的立方和。在判斷時,如果立方和等于 n,說明 n 是一個水仙花數,将它輸出即可。
  • 水仙花數是指一個 n 位數(n≥3)它的每個位上的數字的 n 次幂之和等于它本身。比如 153 就是一個水仙花數,因為 1^3 + 5^3+ 3^3 = 153.

7、求出1000以内的回文數

for n in range(100, 1000):
    # 将 n 轉換為字元串,并将字元串反轉後再轉成數字
    reversed_n = int(str(n)[::-1])

    # 如果翻轉後的數等于 n,則說明 n 是一個回文數
    if reversed_n == n:
        print(n)
           
  • 代碼解析:外層循環 for n in range(100, 1000) 周遊所有三位數,将每個數字轉換成字元串,然後使用字元串切片 [::-1] 反轉它,并将反轉後的字元串轉回數字。在判斷時,如果反轉後的數等于 n,則說明 n 是一個回文數,将它輸出即可。
  • 回文數是指一個數字從左往右和從右往左讀都是一樣的,比如 121、1221。

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]
           
  • 代碼解析:
    • **方式一(循環實作):初始化 a 和 b 為 0 和 1,然後使用 **for 循環周遊 0 到 n-1,每次将 a 和 b 的值更新為 b 和 a+b,最後傳回 a。
    • **方式二(遞歸實作):首先判斷 n 的值是否小于等于 1,如果是,則直接傳回 n。否則,遞歸調用 **fib(n-1) 和 fib(n-2) 并傳回它們的和。
  • 斐波那契數列是指從 0 和 1 開始,後續每個數都等于前兩個數之和的數列。其數值為:1、1、2、3、5、8、13、21、34……在數學上,這一數列以如下遞推的方法定義:F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

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
           

代碼解析:

  • 方式一(循環):使用 for 循環周遊 1~9999 中的每個數字,并将每個數字轉換成字元串,然後查找其中是否包含字元 3。如果包含,則将計數器加 1。最後,計數器的值就是包含數字 3 的元素的個數
  • 方式二(循環+正則比對): re.match() 函數用于檢查清單 a 中的每個元素是否包含數字3。正規表達式 (.*?)3(.*?) 比對任何包含數字3的字元串,無論它在字元串中的位置如何。 filter() 函數用于建立一個新清單,其中僅包含與正規表達式比對的 a 中的元素。 lambda 函數用于定義一個簡單的函數,它接受一個參數 x ,并且如果 re.match('(.*?)3(.*?)',str(x)) 傳回一個比對對象(即如果 x 包含數字3),則傳回 True ,否則傳回 False 。 結果清單被指派給變量 theList 。 - len() 函數用于計算 theList 的長度,這給出了在範圍[1, 9999]中包含數字3的元素的總數。

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]
           
  • 代碼解析: bubble_sort() 函數接收一個清單 arr,并将其進行冒泡排序。具體實作時,使用兩個嵌套的循環對清單中的所有元素進行比較,如果相鄰兩個元素的順序相反,則交換它們的順序,直到整個清單都排好序。 **先定義了一個清單 **arr,然後調用 bubble_sort(arr) 對其進行冒泡排序,并輸出排序後的結果。
  • 冒泡排序是一種基本的排序算法,也是最簡單的一種排序算法之一。它的基本思想是:通過重複交換相鄰的兩個元素來實作排序。具體來說,冒泡排序的過程如下: 從清單的第一個元素開始,依次比較相鄰的兩個元素,如果第一個元素大于第二個元素,則交換它們的位置; 繼續比較第二個元素和第三個元素,如果第二個元素大于第三個元素,則交換它們的位置; 重複上述步驟,直到比較到清單的最後一個元素; 重複上述步驟,直到清單中的所有元素都按照從小到大的順序排列為止。

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)
           
  • 代碼解析: binary_search() 函數接收一個有序清單 arr 和一個待查找的元素 target,并傳回該元素在清單中的下标(從 0 開始計數);如果該元素不在清單中,則傳回 -1。二分查找算法通過不斷地将待查找部分縮小一半來實作查找 **有序清單 **arr 和一個待查找的元素 target,然後調用 binary_search(arr, target) 函數查找該元素在清單中的下标,并輸出結果。
  • 二分查找,也叫二分查找、折半查找,是一種在有序數組中查找某一特定元素的搜尋算法。二分查找每次将查找區間減半,直到找到目标元素,或者确定目标元素不存在于數組中。具體來說,二分查找的基本步驟如下: 首先,令左側下标 low 等于數組的第一個元素下标,右側下标 high 等于數組的最後一個元素下标,計算中間下标 mid; 比較中間下标的值與目标值的大小關系。若相等,則傳回中間下标;若小于目标值,則目标值在中間下标的右側,将 low 置為 mid + 1;否則目标值在中間下标的左側,将 high 置為 mid - 1; 重複上述步驟,直到 low 大于 high,表示查找區間為空,傳回 -1。

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]
           
  • 代碼解析: quick_sort() 函數接收一個清單 arr,并傳回排序後的新清單。具體實作時,先選擇清單中間的元素作為基準值 pivot,然後将清單分成三部分:小于基準值的放在左邊,等于基準值的放在中間,大于基準值的放在右邊。然後遞歸地對左、右兩個子清單進行排序。 **先定義了一個清單 **arr,然後調用 quick_sort(arr) 将其進行快速排序,并輸出排序後的結果。
  • 快速排序(Quick Sort)是一種常用的排序算法,屬于交換排序的一種。其基本思想是:標明一個基準值,将清單分成兩個子清單,小于基準值的放在左邊,大于或等于基準值的放在右邊,然後遞歸地對左、右兩個子清單進行排序,最終将整個清單排序。具體來說,快速排序算法的基本步驟如下: 确定基準值:選取一個基準值,在清單中選擇一個元素作為基準值。 分割:将清單按照基準值進行分割,小于基準值的放在左邊,大于或等于基準值的放在右邊。分割後,将清單分成了兩個部分,左邊部分的所有元素都小于基準值,右邊部分的所有元素都大于或等于基準值。 遞歸:對左、右兩個子清單分别進行快速排序的遞歸操作,直到排序完成。

繼續閱讀