每日一题——二进制间距

简介: 每日一题——二进制间距

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
}

提交结果:

相关文章
|
8月前
|
C语言
c语言编程练习题:7-6 厘米换算英尺英寸
如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot + inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。
209 0
|
7月前
|
C语言
【C语言刷题每日一题#牛客网BC69】——空心正方形图案
【C语言刷题每日一题#牛客网BC69】——空心正方形图案
|
8月前
【编织代码之纵横字符与绚丽字符串](下)
【编织代码之纵横字符与绚丽字符串]
|
8月前
【编织代码之纵横字符与绚丽字符串](上)
【编织代码之纵横字符与绚丽字符串]
|
8月前
|
C语言
【编织代码之纵横字符与绚丽字符串](中)
【编织代码之纵横字符与绚丽字符串]
|
C语言
C语言每日一题之旋转数求最小值
C语言每日一题之旋转数求最小值
1341:【例题】一笔画问题
1341:【例题】一笔画问题
171 0
|
Cloud Native
【刷题日记】868. 二进制间距
本次刷题日记的第 44 篇,力扣题为:868. 二进制间距 ,简单
LeetCode每日一题(8)——二进制间距
二进制间剧 1.题目 2.示例 3.思路 4.代码 5.复杂度分析
|
机器学习/深度学习 算法
LeetCode——868. 二进制间距
LeetCode——868. 二进制间距
55 0

热门文章

最新文章