Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ตรวจสอบว่าอาร์เรย์มีค่าติดกัน (Consecutive) ใน Python


ปัญหา

ให้อาร์เรย์ nums ตรวจสอบว่าประกอบด้วยจำนวนเต็มติดกันหรือไม่

ตัวอย่าง

nums = [6, 8, 3, 5, 4, 7] → เรียงได้ 3,4,5,6,7,8 → True

แนวคิดการแก้ปัญหา (O(n) time, O(1) space แบบแก้ไขอาร์เรย์)

  1. หา min, max
  2. ถ้า max - min + 1 != n → False
  3. ใช้วิธี "ทำเครื่องหมาย" โดยทำให้ค่าที่ index ตรงกันเป็นลบ
  4. ถ้าพบค่าลบซ้ำ → มี duplicate → False

โค้ดตัวอย่าง

def solve(nums):
    n = len(nums)
    if n == 0:
        return False
    min_val, max_val = min(nums), max(nums)
    if max_val - min_val + 1 != n:
        return False
    
    for i in range(n):
        # หา index ที่ควรจะอยู่
        val = abs(nums[i])
        j = val - min_val
        if nums[j] > 0:
            nums[j] = -nums[j]
        else:
            return False  # duplicate
    return True

print(solve([6, 8, 3, 5, 4, 7]))  # True

หมายเหตุ

วิธีนี้แก้ไขอาร์เรย์ต้นฉบับ (in-place) ถ้าต้องการเก็บค่าเดิม ให้ copy ก่อน

อินพุต / เอาต์พุต

Input:  [6, 8, 3, 5, 4, 7]
Output: True