ปัญหา
ให้จำนวนเต็มบวก n ตรวจสอบว่าในรูปแบบไบนารี จำนวน 1 ติดต่อกัน (consecutive 1s) เพิ่มขึ้นจากซ้ายไปขวาหรือไม่
ตัวอย่าง
n = 1775 → binary = 11011101111
บล็อก 1: 11 (2), 111 (3), 1111 (4) → 2, 3, 4 เพิ่มขึ้น → True
แนวคิดการแก้ปัญหา
- แปลงเป็นสตริงไบนารี
- สแกนจากซ้ายไปขวา นับความยาวบล็อก 1 ติดต่อกัน
- เก็บความยาวในลิสต์ ตรวจสอบว่าเพิ่มขึ้นอย่างเคร่งครัด
โค้ดตัวอย่าง
def solve(n):
bits = bin(n)[2:]
blocks = []
count = 0
for b in bits:
if b == '1':
count += 1
elif count > 0:
blocks.append(count)
count = 0
if count > 0:
blocks.append(count)
# ตรวจสอบเพิ่มขึ้นอย่างเคร่งครัด
return all(blocks[i] < blocks[i+1] for i in range(len(blocks)-1))
print(solve(1775)) # True (blocks: 2, 3, 4)
print(solve(23)) # False (10111 → blocks: 1, 2)
อินพุต / เอาต์พุต
Input: 1775 Output: True