每日一题——二进制间距

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

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
}

提交结果:

相关文章
|
7月前
|
算法 Java
算法编程(十四):颠倒二进制位
算法编程(十四):颠倒二进制位
57 0
|
Cloud Native
【刷题日记】868. 二进制间距
本次刷题日记的第 44 篇,力扣题为:868. 二进制间距 ,简单
1341:【例题】一笔画问题
1341:【例题】一笔画问题
159 0
进制转换(二进制,八进制,十进制,十六进制)涵盖整数与小数部分,内容的图片全为手写【详细图解】
进制转换(二进制,八进制,十进制,十六进制)涵盖整数与小数部分,内容的图片全为手写【详细图解】
|
算法 C++ Python
每日算法系列【EOJ 3031】二进制倒置
每日算法系列【EOJ 3031】二进制倒置
|
算法 Java
【五一创作】AcWing——凑数(二进制中1的个数)
【五一创作】AcWing——凑数(二进制中1的个数)
92 0
LeetCode每日一题(8)——二进制间距
二进制间剧 1.题目 2.示例 3.思路 4.代码 5.复杂度分析
|
机器学习/深度学习 算法
LeetCode——868. 二进制间距
LeetCode——868. 二进制间距
50 0
|
算法
算法练习题(六)——Z字型打印矩阵
算法练习题(六)——Z字型打印矩阵
117 0
|
算法 C++
每日算法刷题Day16-和为S的两个数字、数字排列、二进制中1的个数
⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法。
82 0
每日算法刷题Day16-和为S的两个数字、数字排列、二进制中1的个数