这是悦乐书的第292次更新,第310篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第160题(顺位题号是693)。给定正整数,检查它是否具有交替位:即它的二进制数的任意两个相邻位总是具有不同的值。例如:



输入:5

输出:true

说明:5的二进制表示是:101



输入:7

输出:false

说明:7的二进制表示为:111。



输入:11

输出:false

说明:11的二进制表示是:1011。



输入:10

输出:true

说明:10的二进制表示是:1010。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

最直接解法,将正整数转为二进制字符串,借助包装类Integer的toBinaryString方法实现,然后对字符串的字符进行遍历,如果相邻的字符相等了,直接返回false。

public boolean hasAlternatingBits(int n) {
String str = Integer.toBinaryString(n);
for (int i=1; i<str.length(); i++) {
if (str.charAt(i) == str.charAt(i-1)) {
return false;
}
}
return true;
}

03 第二种解法

我们也可以观察下为true的那些数,从1开始:

1,其二进制数为:1

2,其二进制数为:10

5,其二进制数为:101

10,其二进制数为:1010

通过观察这些二进制数,我们可以发现,它们可以看做是10和1的组合体。对于10,可以有零个,也可以有多个,而对于1,只可能是0个或者1个,多了就重复了。因此,我们也可以使用正则表达式来解。

匹配多字符10,使用圆括号;匹配0次或者多次,使用星号,或者{0,}。

匹配1,可以直接写1,匹配0次或者1次,使用问号,或者{0,1}。

public boolean hasAlternatingBits(int n) {
String str = Integer.toBinaryString(n);
//(10){0,}1{0,1} 这样写也是可以的
return str.matches("(10)*1?");
}

04 第三种解法

我们也可以不将其转为二进制字符串,直接使用位运算来判断,借助与(&)运算。与运算的规则是对应位都为1才为1,否则对应位为0。每次将n和1进行与运算,看它最后一位是0还是1,使用一个临时变量,将其二进制数的最后一位记录下来,与当前的最后一位比较,如果相同了,就返回false。

public boolean hasAlternatingBits(int n) {
// 记录每次操作的最后一位
int prev = -1;
while (n > 0) {
if ((n&1) == 1) {
if (prev == 1) {
return false;
}
prev = 1;
} else {
if (prev == 0) {
return false;
}
prev = 0;
}
// 每次将其右移一位
n >>= 1;
}
return true;
}

05 第四种解法

对于第三种解法,我们还可以再简化下。上面我们每进行一次计算都会去判断一下,是否等于上一次计算的最后一位,这里我们将其移动到while循环的判断条件中去,反过来处理,先得到下一次正确的最后一位,看其符不符合。依旧使用一个临时变量,循环继续的条件变成了当前最后一位是否等于预先设定好的那个数,在循环内部,我们对temp变量进行变动,取每次计算的相反值,如果计算为0,那么temp就为1,表示下一次参与计算后的最后一位要为1,否则就去判断n是否已经等于0了。

public boolean hasAlternatingBits(int n) {
int temp = n&1;
while ((n&1) == temp) {
temp = 1-temp;
n >>= 1;
}
return n == 0;
}

06 第五种解法

此解法利用了n的二进制数0与1交替的特征,与自身右移一位后的数进行错位相加,变成了一个全部由1组成的二进制数,然后再利用检测是否全为1的方法,判断是否符合题意。而检测的方法就是,加1后和自身进行与运算,因为如果该二进制数全为1,加1后就转为了首位为1,其余位都是0的二进制数,再与原来的自己进行与运算,运算的结果就是0。比如5,5+5/2变成了7,二进制数为111,加1后,其二进制数变为了1000,两者进行与运算后,得到的结果是0。除以2和右移一位的效果等同。

public boolean hasAlternatingBits(int n) {
// ((n + (n >> 1) + 1) & (n + (n >> 1))) == 0 这样写也行
return ((n+n/2+1) & (n+n/2)) == 0;
}

07 小结

算法专题目前已日更超过四个月,算法题文章160+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Binary Number with Alternating Bits(Java实现)的更多相关文章

  1. LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)

    这是悦乐书的第311次更新,第332篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762).给定两个正整数L和R,在[L,R]范围内,计算每个整数的 ...

  2. 【LeetCode】693. Binary Number with Alternating Bits 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历判断 判断是否是交替模式 位运算 日期 题目地址 ...

  3. LeetCode题解之Binary Number with Alternating Bits

    1.题目描述 2.问题分析 将数值转换为二进制,然后将前面的 0 去掉,再遍历一边二进制字符串,对每个字符和其后部的字符进行比较. 3.代码 bool hasAlternatingBits(int n ...

  4. 693. Binary Number with Alternating Bits - LeetCode

    Question 693. Binary Number with Alternating Bits Solution 思路:输入一个整数,它的二进制01交替出现,遍历其二进制字符串,下一个与上一个不等 ...

  5. 【Leetcode_easy】693. Binary Number with Alternating Bits

    problem 693. Binary Number with Alternating Bits solution1: class Solution { public: bool hasAlterna ...

  6. LeetCode算法题-Perfect Number(Java实现)

    这是悦乐书的第249次更新,第262篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第116题(顺位题号是507).我们定义Perfect Number是一个正整数,它等于 ...

  7. LeetCode算法题-Largest Number At Least Twice of Others(Java实现)

    这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...

  8. LeetCode算法题-Binary Search(Java实现)

    这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...

  9. LeetCode算法题-Binary Tree Tilt(Java实现)

    这是悦乐书的第263次更新,第276篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第130题(顺位题号是563).给定二叉树,返回整棵树的倾斜度.树节点的倾斜被定义为所有 ...

随机推荐

  1. [Abp 源码分析]四、模块配置

    0.简要介绍 在 Abp 框架当中通过各种 Configuration 来实现模块的配置,Abp 本身提供的很多基础设施功能的一些在运行时的行为是通过很多不同的 Configuration 来开放给用 ...

  2. Hive篇---Hive使用优化

    一.前述 本节主要描述Hive的优化使用,Hive的优化着重强调一个 把Hive SQL 当做Mapreduce程序去优化 二.主要优化点 1.Hive运行方式:本地模式集群模式 本地模式开启本地模式 ...

  3. Python内置函数(43)——min

    英文文档: min(iterable, *[, key, default]) min(arg1, arg2, *args[, key]) Return the smallest item in an ...

  4. 8.Django缓存和信号

    缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将某个views的返回值保存至内存或者memcache中, ...

  5. Session知识点

    知识点概要    - Session    - CSRF    - Model操作    - Form验证(ModelForm)    - 中间件    - 缓存    - 信号 内容详细: 1. S ...

  6. Linux命令之sftp - 安全文件传输命令行工具

    用途说明 sftp命令可以通过ssh来上传和下载文件,是常用的文件传输工具,它的使用方式与ftp类似,但它使用ssh作为底层传输协议,所以安全性比ftp要好得多. 常用方式 格式:sftp <h ...

  7. Python操作Redis及连接方式

    前沿:随着互联网的高速发展,数据变得越来越重要,Python成为了人工智能的热门语言,而Nosql数据库已成为日常开发用品. 今天要写的是Python操作Redis Redis的安装我就不介绍了,你可 ...

  8. 关于ML.NET v0.8的发布说明

    ML.NET允许您创建和使用针对场景的机器学习模型,以实现常见任务,如情绪分析,问题分类,预测,推荐,欺诈检测,图像分类等.您可以使用ML.NET示例在GitHub仓库中查看这些常见任务 .ML.NE ...

  9. Python爬虫入门教程 28-100 虎嗅网文章数据抓取 pyspider

    1. 虎嗅网文章数据----写在前面 今天继续使用pyspider爬取数据,很不幸,虎嗅资讯网被我选中了,网址为 https://www.huxiu.com/ 爬的就是它的资讯频道,本文章仅供学习交流 ...

  10. SpringBoot入门教程(八)配置logback日志

    Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和logback-access.logback-c ...