1. 程式人生 > >128、交替位二進位制數

128、交替位二進位制數

給定一個正整數,檢查他是否為交替位二進位制數:換句話說,就是他的二進位制數相鄰的兩個位數永不相等。

示例 1:

輸入: 5
輸出: True
解釋:
5的二進位制數是: 101
示例 2:

輸入: 7
輸出: False
解釋:
7的二進位制數是: 111
示例 3:

輸入: 11
輸出: False
解釋:
11的二進位制數是: 1011
示例 4:

輸入: 10
輸出: True
解釋:
10的二進位制數是: 1010
每次取出一個,跟目前的進行比較,沒什麼難度
程式碼:

class Solution {
    public boolean hasAlternatingBits(int n) {
      //是二的倍數或者是1或0那麼一定是的
		if(n == 1 || n == 0){
			return true;
		}
		int i = n % 2;
		n = n>>1;
		while ( n!=0 ) {
			int j = n % 2;
			if((i ^ j) == 0 ){
				return false;
				
			}else {
				i = j;
				n = n >> 1;
			}
		}
		return true;  
    }
}

排名靠前的,不得不說思路很好,就是將一個數字與其右移一位後進行異或,如果是交替的數字,那麼異或之後都是1,那麼加一以後就是temp的最高位+1為1,那麼與原先的temp與之後就是0,這樣就完美解決了判斷的問題,
比如原先是101010,是交替的,那麼右移後為010101,異或就是111111,加1為1000000,與111111與就是0,是交替的,假如是101011,那麼右移一位就是010101,異或為111110,加一為111111,與之後為1,不是0,那麼就不是交替位二進位制數

class Solution {
    public boolean hasAlternatingBits(int n) {
      int temp=n^(n>>1); return (temp&(temp+1))==0;
    }
}

這個排名也靠前很奇怪

class Solution {
    public boolean hasAlternatingBits(int n) {
        char[] chars = Integer.toBinaryString(n).toCharArray();
        for (int i = 0; i < chars.length - 1; i++) {
            if (chars[i] == chars[i + 1]) { return false; }
        }
        return true;
    }
}