ใช้เทคนิค Bitwise: n = n & (n << 1) ทำซ้ำจนกว่า n จะเป็น 0 จำนวนรอบที่ทำได้คือความยาวของ 1 ติดกันมากที่สุด
หลักการ
n << 1ขยับบิตซ้าย 1 ตำแหน่งn & (n << 1)เก็บเฉพาะบิตที่เป็น 1 ติดกัน (Consecutive 1s)- แต่ละรอบจะลดความยาวของ 1 ติดกันที่ยาวที่สุดลง 1
ตัวอย่าง: 150 (Binary: 10010110) มี 1 ติดกันสูงสุด 2 ตัว
using System;
class Demo
{
private static int FindConsecutive(int i)
{
int count = 0;
while (i != 0)
{
i = (i & (i << 1));
count++;
}
return count;
}
public static void Main()
{
Console.WriteLine(FindConsecutive(150)); // 2
}
}
ผลลัพธ์
2
ประสิทธิภาพ: O(k) โดย k = ความยาว 1 ติดกันมากที่สุด (เร็วมาก)