868. 二進位制間距(C++)
阿新 • • 發佈:2018-12-16
給定一個正整數 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; } };