/**
721 · 下一个稀疏数
算法
Hard
Accepted Rate
38%
DescriptionSolutionNotesDiscussLeaderboard
Description
一个数是稀疏数如果这个数的 二进制表示 中没有相邻的 1,给出一个 n ,找出大于或等于 n 的最小的稀疏数。
eg. 5 (二进制表示为 101)是稀疏数,但是 6 (二进制表示为 110 )不是稀疏数
Example
样例 1:
输入:6
输出:8
解释:
6 = 110(2) 并且 8 = 1000(2)
样例 2:
输入:13
输出:16
解释:
13 = 1101(2) 并且 16 = 10000(2)
https://blog.csdn.net/zhaohengchuan/article/details/78960969
https://www.lintcode.com/problem/721/
*/
package main
/**
* @param x: a number
* @return: return the next sparse number behind x
*/
func nextSparseNum (x int) int {
// write your code here
var vec []int
for {
if x == 0 {
break
}
vec = append(vec, x & 1)
x >>= 1
}
vec = append(vec, 0)
var n = len(vec)
var pos int = 0
for i := 0; i < n - 1; i++ {
if vec[i] == 1 && vec[i - 1] == 1 && vec[i + 1] != 1 {
vec[i + 1] = 1
for j := i; j >= pos; j-- {
vec[j] = 0
}
pos = i + 1
}
}
var res int = 0
for i := 0; i < n; i++ {
res += vec[i] * (1 << uint(i))
}
return res
}