Dưới đây là 10 bài tập Python nâng cao hơn nữa, bao gồm các bài toán về thuật toán, xử lý dữ liệu và tối ưu hóa.
Bài 51: Tìm 3 số có tổng lớn nhất trong danh sách
Đề bài: Nhập vào một danh sách số nguyên, tìm ba số có tổng lớn nhất.
Giải:
lst = list(map(int, input("Nhập danh sách số nguyên: ").split()))
lst.sort(reverse=True)
print(f"Ba số có tổng lớn nhất: {lst[:3]}, Tổng: {sum(lst[:3])}")
Bài 52: Kiểm tra hai danh sách có phần tử chung không
Đề bài: Nhập vào hai danh sách số nguyên, kiểm tra xem chúng có phần tử chung không.
Giải:
lst1 = set(map(int, input("Nhập danh sách 1: ").split()))
lst2 = set(map(int, input("Nhập danh sách 2: ").split()))
print("Có phần tử chung" if lst1 & lst2 else "Không có phần tử chung")
Bài 53: Tìm tất cả số nguyên tố trong danh sách
Đề bài: Nhập vào một danh sách số nguyên, tìm tất cả số nguyên tố trong danh sách.
Giải:
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
lst = list(map(int, input("Nhập danh sách số nguyên: ").split()))
primes = [x for x in lst if is_prime(x)]
print("Các số nguyên tố trong danh sách:", primes)
Bài 54: Tìm số lớn thứ hai trong danh sách
Đề bài: Nhập vào một danh sách số nguyên, tìm số lớn thứ hai.
Giải:
lst = list(set(map(int, input("Nhập danh sách số nguyên: ").split())))
lst.sort(reverse=True)
if len(lst) > 1:
print("Số lớn thứ hai:", lst[1])
else:
print("Không có số lớn thứ hai")
Bài 55: Sắp xếp danh sách theo tổng chữ số của số
Đề bài: Nhập vào một danh sách số nguyên, sắp xếp danh sách theo tổng các chữ số của từng số.
Giải:
def sum_digits(n):
return sum(int(digit) for digit in str(abs(n)))
lst = list(map(int, input("Nhập danh sách số nguyên: ").split()))
lst.sort(key=sum_digits)
print("Danh sách sau khi sắp xếp:", lst)
Bài 56: Tìm các số có tổng chữ số chia hết cho 3
Đề bài: Nhập vào một danh sách số nguyên, tìm các số có tổng các chữ số chia hết cho 3.
Giải:
lst = list(map(int, input("Nhập danh sách số nguyên: ").split()))
result = [x for x in lst if sum(int(d) for d in str(abs(x))) % 3 == 0]
print("Các số có tổng chữ số chia hết cho 3:", result)
Bài 57: Loại bỏ các số trùng nhau trong danh sách
Đề bài: Nhập vào một danh sách số nguyên, loại bỏ tất cả các số trùng nhau sao cho danh sách chỉ còn các số xuất hiện một lần.
Giải:
from collections import Counter
lst = list(map(int, input("Nhập danh sách số nguyên: ").split()))
counter = Counter(lst)
unique_elements = [x for x in lst if counter[x] == 1]
print("Danh sách sau khi loại bỏ số trùng:", unique_elements)
Bài 58: Tìm hai số có tổng gần nhất với 0
Đề bài: Nhập vào một danh sách số nguyên, tìm hai số có tổng gần nhất với 0.
Giải:
import itertools
lst = list(map(int, input("Nhập danh sách số nguyên: ").split()))
closest_pair = min(itertools.combinations(lst, 2), key=lambda x: abs(sum(x)))
print(f"Hai số có tổng gần 0 nhất: {closest_pair}, Tổng: {sum(closest_pair)}")
Bài 59: Kiểm tra danh sách có phải hoán vị của một dãy số không
Đề bài: Nhập vào một danh sách số nguyên, kiểm tra xem nó có phải hoán vị của dãy số từ 1 đến n không (n là số phần tử trong danh sách).
Giải:
lst = list(map(int, input("Nhập danh sách số nguyên: ").split()))
n = len(lst)
print("Danh sách là hoán vị của 1 đến n" if sorted(lst) == list(range(1, n + 1)) else "Danh sách không phải hoán vị")
Bài 60: Tìm dãy con có tổng lớn nhất (Kadane’s Algorithm)
Đề bài: Nhập vào một danh sách số nguyên, tìm dãy con liên tiếp có tổng lớn nhất.
Giải:
def max_subarray_sum(lst):
max_sum = current_sum = lst[0]
for num in lst[1:]:
current_sum = max(num, current_sum + num)
max_sum = max(max_sum, current_sum)
return max_sum
lst = list(map(int, input("Nhập danh sách số nguyên: ").split()))
print("Tổng dãy con lớn nhất:", max_subarray_sum(lst))