1. 程式人生 > >868. 二進位制間距(C++)

868. 二進位制間距(C++)

給定一個正整數 N,找到並返回 N 的二進位制表示中兩個連續的 1 之間的最長距離。 

如果沒有兩個連續的 1,返回 0 。

示例 1:

輸入:22
輸出:2
解釋:
22 的二進位制是 0b10110 。
在 22 的二進位制表示中,有三個 1,組成兩對連續的 1 。
第一對連續的 1 中,兩個 1 之間的距離為 2 。
第二對連續的 1 中,兩個 1 之間的距離為 1 。
答案取兩個距離之中最大的,也就是 2 。

示例 2:

輸入:5
輸出:2
解釋:
5 的二進位制是 0b101 。

示例 3:

輸入:6
輸出:1
解釋:
6 的二進位制是 0b110 。

示例 4:

輸入:
8 輸出:0 解釋: 8 的二進位制是 0b1000 。 在 8 的二進位制表示中沒有連續的 1,所以返回 0 。

提示:

  • 1 <= N <= 10^9
  • 【思路】每次左移1位,和1按位與,檢測該位是否為1;然後記錄1的位置,和下一個1所在的位置相減,得距離,再取最大距離即可。
  • class Solution {
    public:
       int binaryGap(int N) {
    	int temp = 0;
    	int ret = 0;
    	int i = 0;
    	int lastindex = -1;//記錄上次1的位置
    	int len = 0;
    	while (N > temp)//每左移一位,遇到0就temp加1,和N比較,如果大於N則說明再往右沒有1了,跳出迴圈
    	{
    		if (N & (1 << i))
    		{
    			if (lastindex == -1)//遇到第一個1,只記錄這個1的位置
    			{
    				ret = 0;
    				lastindex = i;
    			}
    			else
    			{		
    				len = i - lastindex;//上次1的位置和這次1的位置差值為距離
    				ret = ret > len ? ret : len;//若本次距離大,則賦值給ret
                    lastindex = i;	
    			}			
    		}
    		else
    		{
    			temp += (1 << i);
    		}
    		i++;		
    	}
    	return ret;
    }
    };