1 题目描述

题目来源: https://leetcode-cn.com/problems/binary-gap/

给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。

如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如,"1001" 中的两个 1 的距离为 3 。

2 解题思路与代码

2.1 原始解决方法: BinaryString+游标

2.1.1 思路

  • step0 边界条件: 10^9 < int型(Java)的最大值(21,4748,3647)
  • step1 Int型输入参数n转二进制字符串binaryStr
方法1:可利用Java基本数据类型包装类的内置函数 dataType.toBinaryString(val)
方法2:手写进制转码程序
  • step2 设置2个对binaryStr从左到右遍历的游标startIndexcurrentIndex,并最终筛选出【最大跨步长度值】maxLengthValue
startIndex(开始游标): 跨步的开始下标
向后滑动/变更的条件:当前的【跨步(Gap)】刚计算完成时: 即 currentIndex(endIndex) 遇到 1 的时候 currentIndex(当前游标):不停向后滑动的游标 or 作为跨步的结束下标

2.1.2 源码(Java)

class Solution {
public int binaryGap(int n) {
String binaryStr = Integer.toBinaryString(n);// int 转 二进制字符串 int maxLengthValue = -1;//[结果字段] 字符串Gap的最大长度值(初始值: 0 or -1)
int strLength = strLength=binaryStr.length(); // 字符串长度
int startIndex = 0;//开始游标。向后滑动/变更的条件:当前的【跨步(Gap)】刚计算完成时: 即 currentIndex(endIndex) 遇到 1 的时候
int currentIndex = 0;//当前游标。 while(currentIndex<strLength){
if(binaryStr.charAt(currentIndex) == '1') {
maxLengthValue = (currentIndex-startIndex)>maxLengthValue?(currentIndex-startIndex):maxLengthValue;
startIndex = currentIndex;
}
currentIndex++;//向后滑动
}
return maxLengthValue;
}
}

内存消耗太高,估计是: Integer.toBinaryString(xx) 函数所致

2.2 官方解决思路: 位运算 + 游标

官方解题思路: https://leetcode-cn.com/problems/binary-gap/solution/er-jin-zhi-jian-ju-by-leetcode-solution-dh2q/

2.2.1 思路

我们可以使用一个循环从 n 二进制表示的低位开始进行遍历,并找出所有的 1

我们用一个变量 last 记录上一个找到的 1 的位置。

如果当前在第 i 位找到了 1,那么就用 i−last 更新答案,再将 last 更新为 i 即可。

在循环的每一步中,我们可以使用位运算 n & 1 获取 n 的最低位,判断其是否为 1

在这之后,我们将 n 右移一位:n = n >> 1,这样在第 i 步时,n & 1 得到的就是初始 n 的第 i 个二进制位。

与思路1的区别

思路2:采用位运算,减少了转换位二进制的内存消耗,也减轻了判断1是否来临的CPU资源运算压力

运算方向(此因素无所谓):思路2————从右向左滑动;思路1————从左向右滑动

last 即 思路1中的 startIndex

i 即 思路1中的 currentIndex

2.2.2 源码(Java)

class Solution {
public int binaryGap(int n) {
int last = -1, ans = 0;
for (int i = 0; n != 0; ++i) {
if ((n & 1) == 1) {
if (last != -1) {
ans = Math.max(ans, i - last);
}
last = i;
}
n >>= 1;
}
return ans;
}
}

or

class Solution {
public int binaryGap(int n) {
int last = -1;//设置为-1,是因为从右向左滑动,要避免 1000...00 这类 特殊情况
int maxGap = 0;
for(int i=0;n!=0;i++){
if((n&1) == 1){
if(last!=-1) {
maxGap = (i-last)>maxGap?i-last:maxGap;
}
last = i;
}
n = n>>1; // n继续向右移动1位
}
return maxGap;
}
}

Y 相关知识

Y.1 进制间转换 *

import java.util.Stack;

public class ConversionNumber {
//10进制数 转 K 进制
public static String transerToKNumber(int n, int k){
Stack stack = new Stack();
while(k<=n){
stack.push(n%k);
n = n/k;
}
stack.push(n);
StringBuilder resultStringBuilder = new StringBuilder(); while(!stack.empty()){
resultStringBuilder.append(stack.pop());
}
return resultStringBuilder.toString();
} public static void main(String[] args) {
int n = 18; // 10进制数
int k = 2; // k 进制
System.out.println(transerToKNumber(n, k));//10010
}
}

Y.2 Java的包装类API

Y.3 Java的位运算 *

与 &

按位与&:若相对应位都为1,则为1,否则为0 “有假则假”

或 |

按位或|:若相对应位其中一个为1,则为1,否则为0 “有真则真”

异或 ^

按位异或^:若相对应位互不相同,则为1,否则为0 “相同为假,相异为真”

位右移 >>

位右移>>,符号不变: 二进制数向右移动指定位数,高位补相应0填充 “高位补0”;右移几位就除以2的几次方

位左移 <<

位左移<<:二进制数向左移动指定位数,低位补相应0填充 ”低位补0”;左移几位就乘以2的几次方

X 参考文献

[Java/LeetCode]算法练习:二进制间距(868/simple)的更多相关文章

  1. Leetcode 868. 二进制间距

    868. 二进制间距  显示英文描述 我的提交返回竞赛   用户通过次数201 用户尝试次数220 通过次数207 提交次数396 题目难度Easy 给定一个正整数 N,找到并返回 N 的二进制表示中 ...

  2. [leetcode] (周赛)868. 二进制间距

    868. 二进制间距 读懂题意就出来了 class Solution { public int binaryGap(int N) { String s = Integer.toBinaryString ...

  3. LeetCode算法题-Binary Number with Alternating Bits(Java实现)

    这是悦乐书的第292次更新,第310篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第160题(顺位题号是693).给定正整数,检查它是否具有交替位:即它的二进制数的任意两 ...

  4. LeetCode算法题-Two Sum IV - Input is a BST(Java实现)

    这是悦乐书的第280次更新,第296篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第148题(顺位题号是653).给定二进制搜索树和目标数,如果BST中存在两个元素,使得 ...

  5. LeetCode算法题-Subtree of Another Tree(Java实现)

    这是悦乐书的第265次更新,第278篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第132题(顺位题号是572).给定两个非空的二进制树s和t,检查树t是否具有完全相同的 ...

  6. LeetCode算法题-Convert BST to Greater Tree(Java实现)

    这是悦乐书的第255次更新,第268篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第122题(顺位题号是538).给定二进制搜索树(BST),将其转换为更大树,使原始BS ...

  7. LeetCode算法题-Max Consecutive Ones(Java实现)

    这是悦乐书的第242次更新,第255篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第109题(顺位题号是485).给定二进制数组,找到此数组中连续1的最大数量.例如: 输 ...

  8. LeetCode算法题-Number Complement(Java实现-五种解法)

    这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...

  9. LeetCode算法题-Hamming Distance(Java实现)

    这是悦乐书的第237次更新,第250篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第104题(顺位题号是461).两个整数之间的汉明距离是相应位不同的位置数.给定两个整数 ...

  10. LeetCode算法题-Convert a Number to Hexadecimal(Java实现)

    这是悦乐书的第219次更新,第231篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第86题(顺位题号是405).给定一个整数,写一个算法将其转换为十六进制.对于负整数,使 ...

随机推荐

  1. Linux deploy 32位系统 怎么安装宝塔怎么安装linux系统安装宝塔后搭建网站

    getconf LONG_BIT 获取当前linux系统位数

  2. 第11章 配置ASP.NET Core应用程序(ASP.NET Core in Action, 2nd Edition)

    本章包括 从多个配置提供程序加载设置 安全存储敏感设置 使用强类型设置对象 在不同的宿主环境中使用不同的设置 在本书的第1部分中,您学习了ASP.NET Core应用程序启动和运行的基础知识,以及如何 ...

  3. php json_encode使用中文不转码

    PHP转JSON,中文会被转码成unicode,使用常量JSON_UNESCAPED_UNICODE可以使中文原样输入 echo json_encode("中文"); //Outp ...

  4. md文件使用说明

    md文件简单使用介绍 二级标题 三级标题 斜体文本 粗体文本 粗斜体文本 分隔线 删除号 带下划线 创建脚注格式类似这样 [1]. #include <iostream> using na ...

  5. 题解,洛谷P3435

    根据题意,分析如右图 显然,对于每个前缀,有这样的性质A==B==C,所以,周期最长则a最短,即求该字符串的最短公共前后缀.通过kmp算法中nex数组的迭代,很容易求得最短前后缀. for(int i ...

  6. unity更改c#文件名的小tip

    今天偶然知道了一个在Unity中更改代码文件名的小技巧--最好先在Unity的project视图里找到文件,改完后再去visual studio等代码编辑器里改里面的类名. 以前都没注意,想起来要改某 ...

  7. Python第六章实验报告

    一.实验内容:<零基础学Python>第六章实例和实战,以及一道作业题 二.实验环境:IDLE Shell 3.9.7 三.实验目的和要求:掌握定义和调用函数.变量的作用域.匿名函数.参数 ...

  8. Flask CURD(增删改查)

    1.创建flask项目 2.修改配置文件: ''' config.py 保存项目配置 ''' 导入Flask模块 from flask import Flask 额外安装: 数据库操作模块 from ...

  9. 登录:ORA-12504:TNS:监听程序在CONNECT_DATA中未获得SERVICE_NAME

    问题描述:在用pl/sql登录soctt用户时,显示: 解决办法:在tnsnames.ora文件中添加(文件位置的查找方法见文章末尾) ORCL = (DESCRIPTION = (ADDRESS = ...

  10. ajax缓存和fiddler——http协议调试代理工具

    1.在ie9下,ajax请求可能会有缓存,需要在请求上一个随机数 如:Math.random(); 2.fiddler2 打开以后可以查看所有的http请求情况,也可以使用本地脚本代替要请求的js文件 ...