868. 二进制间距
题目描述:
给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。
如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。如,“1001” 中的两个 1 的距离为 3 。
示例1:
输入:n = 22
输出:2
解释:22 的二进制是 “10110” 。
在 22 的二进制表示中,有三个 1,组成两对相邻的 1 。
第一对相邻的 1 中,两个 1 之间的距离为 2 。
第二对相邻的 1 中,两个 1 之间的距离为 1 。
答案取两个距离之中最大的,也就是 2 。
示例2:
输入:n = 8
输出:0
解释:8 的二进制是 “1000” 。
在 8 的二进制表示中没有相邻的两个 1,所以返回 0 。
思路:
利用strconv.FormatInt(n,2) 将n转化成二进制,计算有多少个1,如果有1个或0个,是不存在相邻的1的,返回0;否则,有几次1进入几次循环,每次循环,求第一个1的位置+1(下标是0开始的,题中要求要的是二进制位置的绝对差),更新当前距离,更新字符串,继续循环,每次都是求第一个1的位置,最后返回ans即可,ans是每次比较后的较大的一个。
题解:
func binaryGap(n int) int { ans := 0 binaryN := strconv.FormatInt(int64(n), 2) count := strings.Count(binaryN, "1") start := 0 // 如果只有1个或者0个,是不存在相邻1的 if count == 1 || count == 0 { return 0 } // for i := 0; i < count; i++ { firstIndex := strings.Index(binaryN, "1") // 计算本次找到的1的距离上次找到的1的距离 distance := firstIndex + 1 // 取最大值 ans = max(distance, ans) //fmt.Println("binaryN: ",binaryN,",ans: ",ans) // 更新上次找到1的距离 start = firstIndex // 在剩下的字符串里找第一个1 binaryN = binaryN[start+1:] } return ans } func max(a, b int) int { if a > b { return a } return b }
提交结果: