Thiếu số trong chương trình tuần tự trong Python
Ngoài giải pháp của OriginalGriff[^], tôi muốn cung cấp mã mẫu với một chút cải tiến
Giải pháp của tôi dựa trên LINQ Kết quả Show For list: [6;0;0;5;9;9;5;9;8;5;9;6] missing value is: 0 For list: [60;5;99;59;85;96] missing value is: 0 For list: [600;599;598;596] missing value is: 597 For list: [600599;598596] missing value is: 0 Trong trường hợp bạn muốn trả về danh sách các giá trị bị thiếu, hãy thay đổi truy vấn cuối cùng thành biểu mẫu này var misVal = numbers.Zip(numbers.Skip(1), (first, second) => Tuple.Create(first, second, first-second-1)) .Where(x=>x.Item3==1) .Select(x=>x.Item2+1) .ToList(); Vui lòng thay đổi mã theo nhu cầu của bạn Công cụ sau đây trực quan hóa những gì máy tính đang làm từng bước khi nó thực thi chương trình nói trên Trình chỉnh sửa mã Python Đóng góp mã và nhận xét của bạn thông qua Disqus Trước. Viết chương trình Python để tìm một số còn thiếu trong danh sách Mức độ khó của bài tập này là gì? Dễ dàng trung bình khóKiểm tra kỹ năng Lập trình của bạn với bài kiểm tra của w3resource Theo dõi chúng tôi trên Facebook và Twitter để cập nhật thông tin mới nhất. con trăn. Lời khuyên trong ngàyDeque Một deque hoặc (Hàng đợi kết thúc kép) là một đối tượng Python hai đầu mà bạn có thể thực hiện một số thao tác nhất định từ cả hai đầu Nó có thể được sử dụng khi cần vận hành một bộ sưu tập ở cả hai đầu và có thể mang lại hiệu quả và tính đơn giản so với các cấu trúc dữ liệu truyền thống như danh sách Giả sử chúng ta có một danh sách các số được gọi là nums kích thước n trong đó tất cả các số trong danh sách đều có mặt trong khoảng [1, n] một số phần tử có thể xuất hiện hai lần trong khi những phần tử khác chỉ xuất hiện một lần. Ta phải tìm tất cả các số từ [1, n] sao cho chúng không có trong danh sách. Chúng ta phải trả về các số được sắp xếp theo thứ tự tăng dần. Chúng ta phải cố gắng tìm một giải pháp có thời gian tuyến tính và không gian không đổi Vì vậy, nếu đầu vào là [4, 4, 2, 2, 6, 6], thì đầu ra sẽ là [1, 3, 5] Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
Chúng ta hãy xem triển khai sau đây để hiểu rõ hơn - Thí dụBản thử trực tiếp class Solution: def solve(self, nums): arr = [0]*(len(nums)+1) for i in nums: arr[i] += 1 missing = [] for i in range(len(arr)): if arr[i] == 0 and i != 0: missing.append(i) return missing ob = Solution() print(ob.solve([4, 4, 2, 2, 6, 6])) Đầu vào[4, 4, 2, 2, 6, 6] đầu ra[1, 3, 5] Nếu trình tự đầu vào được sắp xếp, bạn có thể sử dụng bộ tại đây. Lấy giá trị bắt đầu và kết thúc từ danh sách đầu vào
Điều này giả sử Python 3; Cuộc gọi Thử nghiệm
Một cách tiếp cận khác là phát hiện khoảng cách giữa các số tiếp theo;
Đây là thao tác O(n) thuần túy và nếu bạn biết số lượng mục bị thiếu, bạn có thể đảm bảo rằng nó chỉ tạo ra những mục đó rồi dừng lại Có nhiều cách để giải quyết vấn đề này bằng Python. Trong bài viết này, chúng tôi sẽ đề cập đến những điều đơn giản nhất thuật toánBước 1. Tạo một mảng trống cho các mục bị thiếu Bước 2. Lặp qua các phần tử trong phạm vi của phần tử đầu tiên và cuối cùng của mảng Bước 3. So sánh biến vòng lặp với mảng đã cho nếu giá trị không xuất hiện, hãy thêm nó vào mảng bị thiếu Ghi chú. Mảng phải được sắp xếp để làm việc này. Sử dụng Giải pháp 1________số 8_______đầu ra 2. Sử dụng danh sách hiểu
đầu ra
Sử dụng khả năng hiểu danh sách, chúng tôi gói gọn giải pháp trên trong một dòng 3. Sử dụng Bộ()
đầu ra
Ở đây, chúng tôi đã tạo một đối tượng tập hợp có các giá trị trong phạm vi giá trị đầu và cuối của mảng được cung cấp, sau đó so sánh nó với mảng được cung cấp để lấy giá trị còn thiếu |