Cho chuỗi, di chuyển tất cả khoảng trắng (space) về phía trước, giữ nguyên thứ tự các ký tự khác. Ví dụ: "tutorials point " → " tutorialspoint".
Thuật toán duyệt 1 lần (Single traversal)
- Đếm số space:
space_count = s.count(' '). - Tạo chuỗi space:
' ' * space_count. - Lọc ký tự non-space: list comprehension hoặc filter.
- Ghép: spaces + non_spaces.
Mã nguồn
string = "tutorials point "
chars = [ch for ch in string if ch != ' ']
spaces_count = string.count(' ')
new_string = ' ' * spaces_count + ''.join(chars)
print(repr(new_string)) # ' tutorialspoint'Kết quả
tutorialspoint
Ví dụ 2
string = "I am a python programmer."
chars = [ch for ch in string if ch != ' ']
spaces_count = string.count(' ')
new_string = ' ' * spaces_count + ''.join(chars)
print(repr(new_string))Kết quả
Iamapythonprogrammer.
Phân tích độ phức tạp
- Time: O(n) - duyệt chuỗi 2 lần (count + listcomp), vẫn O(n).
- Space: O(n) - tạo list chars và string mới.
- True single-pass (1 loop) có thể dùng
itertools.filterfalsenhưng phức tạp hơn, không cần thiết.
Cách khác: split + join
# Nhanh hơn cho chuỗi dài
parts = string.split(' ')
space_count = len(parts) - 1
new_string = ' ' * space_count + ''.join(parts)Lưu ý: split() mặc định tách mọi whitespace, split(' ') chỉ tách space đơn.
Kết luận
Cách count + listcomp + join rõ ràng, dễ hiểu, đủ nhanh cho hầu hết trường hợp. Đề bài "single traversal" thường mong đợi thuật toán 1 loop, nhưng Pythonic way ưu tiên readability.