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

Python - หาลำดับ 1 ติดกันยาวที่สุดในรูปแบบไบนารีของตัวเลข

โจทย์: กำหนดตัวเลขไม่ติดลบ n หาความยาวของลำดับ 1 ติดกัน (Consecutive 1s) ที่ยาวที่สุดในรูปแบบไบนารีของ n

ตัวอย่าง

Input: n = 1469
Output: 4
เหตุผล: 1469 ในไบนารี = 10110111101 มีลำดับ 1 ติดกันยาวสุด 4 ตัว (1111)

อัลกอริทึม: Bit Manipulation Trick

ใช้คุณสมบัติ: n & (n << 1) จะกำจัด 1 ตัวสุดท้ายของแต่ละลำดับ 1 ติดกัน ทำซ้ำจน n == 0 จำนวนรอบ = ความยาวลำดับ 1 ติดกันยาวสุด

หลักการทำงาน

n = 1469 = 10110111101₂

Round 1: n & (n << 1)
10110111101
& 01101111010  (<< 1)
= 00100111000  → นับ 1

Round 2: n & (n << 1)
00100111000
& 01001110000
= 00000110000  → นับ 2

Round 3: n & (n << 1)
00000110000
& 00001100000
= 00000100000  → นับ 3

Round 4: n & (n << 1)
00000100000
& 00001000000
= 00000000000  → นับ 4, n=0 หยุด

โค้ด Python

def solve(n):
    count = 0
    while n != 0:
        n = n & (n << 1)
        count += 1
    return count

# ทดสอบ
n = 1469
print(solve(n))  # Output: 4

ความซับซ้อน

  • Time Complexity: O(k) โดย k = ความยาวลำดับ 1 ติดกันยาวสุด (สูงสุด log₂ n)
  • Space Complexity: O(1)

วิธีอื่น (String-based)

def solve_string(n):
    binary = bin(n)[2:]  # ตัด '0b' ออก
    return max(len(s) for s in binary.split('0'))

print(solve_string(1469))  # 4

การทดสอบเพิ่มเติม

print(solve(0))       # 0 (ไบนารี: 0)
print(solve(1))       # 1 (ไบนารี: 1)
print(solve(3))       # 2 (ไบนารี: 11)
print(solve(7))       # 3 (ไบนารี: 111)
print(solve(15))      # 4 (ไบนารี: 1111)
print(solve(1469))    # 4 (ไบนารี: 10110111101)
print(solve(2**20-1)) # 20 (ทั้งหมดเป็น 1)

การประยุกต์ใช้

  • Bit manipulation tricks
  • การวิเคราะห์รูปแบบบิต
  • โจทย์แข่งขันเขียนโปรแกรม (Competitive Programming)