ปัญหา
สมมติว่าเรามีจำนวนเต็มบวก เราต้องตรวจสอบว่ามันมีบิตสลับกันหรือไม่ คือ บิตที่อยู่ติดกันจะมีค่าต่างกันเสมอ
เช่น ถ้าผนวกเข้าเป็น 10 ผลลัพธ์จะเป็น True เนื่องจากการแทนค่าในรูปแบบไบนารีของ 10 คือ 1010
วิธีแก้ปัญหา
- p := n AND 1
- ถ้า n < 2: คืนค่า true
- n := n/2
- while n ไม่เท่ากับ 0 ทำ:
- c := n AND 1
- ถ้า c XOR p เท่ากับ 0: คืนค่า false
- p := c
- n := n/2
- คืนค่า true
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool hasAlternatingBits(int n) {
bool p = n & 1;
bool c;
if (n < 2)
return true;
n >>= 1;
while (n) {
c = n & 1;
if (c ^ p == 0)
return false;
p = c;
n >>= 1;
}
return true;
}
};
int main(){
Solution ob;
cout << (ob.hasAlternatingBits(10));
}
อินพุต
10
เอาต์พุต
1