这是悦乐书的第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。

  1. public boolean hasAlternatingBits(int n) {
  2. String str = Integer.toBinaryString(n);
  3. for (int i=1; i<str.length(); i++) {
  4. if (str.charAt(i) == str.charAt(i-1)) {
  5. return false;
  6. }
  7. }
  8. return true;
  9. }

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}。

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

04 第三种解法

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

  1. public boolean hasAlternatingBits(int n) {
  2. // 记录每次操作的最后一位
  3. int prev = -1;
  4. while (n > 0) {
  5. if ((n&1) == 1) {
  6. if (prev == 1) {
  7. return false;
  8. }
  9. prev = 1;
  10. } else {
  11. if (prev == 0) {
  12. return false;
  13. }
  14. prev = 0;
  15. }
  16. // 每次将其右移一位
  17. n >>= 1;
  18. }
  19. return true;
  20. }

05 第四种解法

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

  1. public boolean hasAlternatingBits(int n) {
  2. int temp = n&1;
  3. while ((n&1) == temp) {
  4. temp = 1-temp;
  5. n >>= 1;
  6. }
  7. return n == 0;
  8. }

06 第五种解法

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

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

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.简介 事件总线就是订阅/发布模式的一种实现,本质上事件总线的存在是为了降低耦合而存在的. 从上图可以看到事件由发布者发布到事件总线处理器当中,然后经由事件总线处理器调用订阅者的处理方法,而发布者和 ...

  2. ElasticSearch(1)---Mysql同步数据到ElSearch

    ElasticSearch同步Mysql 先讲项目需求:对于资讯模块添加搜索功能 这个搜索功能我就是采用ElasticSearch实现的,功能刚实现完,所以写这篇博客做个记录,让自己在记录下整个步骤和 ...

  3. vue踩坑--TypeError: __WEBPACK_IMPORTED_MODULE_1_vuex__.a.store is not a constructor

    今天在使用vuex的时候遇到这么个问题,虽然后来解决了,是首字母大写的原因,但我还是不知道为什么.这里先记录下来. 这是vuex/store.js import Vue from 'vue' impo ...

  4. 《HelloGitHub》第 12 期

    <HelloGitHub>第 12 期 兴趣是最好的老师,<HelloGitHub>就是帮你找到兴趣! 简介 最开始我只是想把自己在浏览 GitHub 过程中,发现的有意思.高 ...

  5. PE知识复习之PE的RVA与FOA的转换

    PE知识复习之PE的RVA与FOA的转换 一丶简介PE的两种状态 首先我们知道PE有两种状态.一种是内存展开.一种是在文件中的状态.那么此时我们有一个需求. 我们想改变一个全局变量的初始值.此时应该怎 ...

  6. [PHP] curl访问https与CA证书问题

    CA证书,用来在调用HTTPS资源的时候,验证对方网站是否是CA颁布的证书,而不是自己随便生成的 curl命令1.需要下载CA证书 文件地址是 http://curl.haxx.se/ca/cacer ...

  7. PhpStorm 安装ApiDebugger

    ApiDebugger,是一个开源的接口调试IntelliJ IDEA插件,具有与IDEA一致的界面,无需切换程序即可完成网络API请求,让你的code更加沉浸式. 安装 File->Setti ...

  8. 小程序多端框架全面测评:chameleon、Taro、uni-app、mpvue、WePY

    摘要: 微信小程序开发技巧. 作者:coldsnap 原文:小程序多端框架全面测评 Fundebug经授权转载,版权归原作者所有. 最近前端届多端框架频出,相信很多有代码多端运行需求的开发者都会产生一 ...

  9. 流程控制值while 循环

    一.结束循环的两种方式 1. 修改条件tag=Truewhile tag: print(1) print(2) print(3) tag=False print(4) 2.while + break ...

  10. 23 , CSS 构造列表与导航

    1. 列表图片 2. 背景列表 3. 翻转列表 4. 水平导航 1. 内边距与外边距 Ul { Margin: 0; Padding: 0; } 2. 使用图片作为列表图标 Ul { Margin: ...