LeetCode算法题-Binary Number with Alternating Bits(Java实现)
这是悦乐书的第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实现)的更多相关文章
- LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)
这是悦乐书的第311次更新,第332篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762).给定两个正整数L和R,在[L,R]范围内,计算每个整数的 ...
- 【LeetCode】693. Binary Number with Alternating Bits 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历判断 判断是否是交替模式 位运算 日期 题目地址 ...
- LeetCode题解之Binary Number with Alternating Bits
1.题目描述 2.问题分析 将数值转换为二进制,然后将前面的 0 去掉,再遍历一边二进制字符串,对每个字符和其后部的字符进行比较. 3.代码 bool hasAlternatingBits(int n ...
- 693. Binary Number with Alternating Bits - LeetCode
Question 693. Binary Number with Alternating Bits Solution 思路:输入一个整数,它的二进制01交替出现,遍历其二进制字符串,下一个与上一个不等 ...
- 【Leetcode_easy】693. Binary Number with Alternating Bits
problem 693. Binary Number with Alternating Bits solution1: class Solution { public: bool hasAlterna ...
- LeetCode算法题-Perfect Number(Java实现)
这是悦乐书的第249次更新,第262篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第116题(顺位题号是507).我们定义Perfect Number是一个正整数,它等于 ...
- LeetCode算法题-Largest Number At Least Twice of Others(Java实现)
这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...
- LeetCode算法题-Binary Search(Java实现)
这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...
- LeetCode算法题-Binary Tree Tilt(Java实现)
这是悦乐书的第263次更新,第276篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第130题(顺位题号是563).给定二叉树,返回整棵树的倾斜度.树节点的倾斜被定义为所有 ...
随机推荐
- Gin框架源码解析
Gin框架源码解析 Gin框架是golang的一个常用的web框架,最近一个项目中需要使用到它,所以对这个框架进行了学习.gin包非常短小精悍,不过主要包含的路由,中间件,日志都有了.我们可以追着代码 ...
- 【朝花夕拾】Android Log篇
前言 从事Android开发的这些年中,经常碰到这样一个现象:同一款app中,往往有好几种风格迥异的log处理方式,有时候会让维护者晕头转向.同时笔者也经常碰带一些模棱两可的问题:Log等级分好几种 ...
- MacPro4,1升级到MacPro5,1
收了一台老MacPro,2009年版本,准确型号是"MacPro4,1".机器很好,美中不足的是,太老了.硬件还好说,很多部件都可以单独采购升级,特别是有了淘宝,几乎只要有的东西, ...
- 产品研发团队如何融合OKR与Scrum敏捷开发?
「 OKR 」现在非常的火爆,很多公司都在使用,不仅国外的 Google.英特尔等大公司在用,国内的一线知名互联网企业今日头条和一些创业团队也都在使用. 那为什么「 OKR 」这么受欢迎呢,因为把它可 ...
- Perl信号处理
本文关于Perl信号处理的内容主体来自于<Pro Perl>的第21章. 信号处理 操作系统可以通过信号(signal)处理机制来实现一些功能:程序注册好待监视的信号处理机制,在程序运行过 ...
- Python之celery的简介与使用
celery的简介 celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度.它的执行单元为任务(task),利用多线程,如Eventlet,gevent等,它们能 ...
- js密码修改显示与隐藏效果
一.添加input框 <form class="login_form"> <input class="password inputpwd" i ...
- (摘)使用 .NET Core 实现依赖关系注入
为什么使用依赖关系注入? 使用 .NET,通过 new 运算符(即,new MyService 或任何想要实例化的对象类型)调用构造函数即可轻松实现对象实例化.遗憾的是,此类调用会强制实施客户端(或应 ...
- [PHP] yield沟通函数循环内外
1.yield是函数内外,循环内外沟通用的 , 当你的函数需要返回一个大数组 , 循环的时候需要遍历这个大数组时 , 并且需要多次遍历这个函数的返回值 , 这个是有用的 2.当我也是只需要在一次循环中 ...
- Java开发笔记(七十五)异常的处理:扔出与捕捉
前面介绍的几种异常(不包含错误),编码的时候没认真看还发现不了,直到程序运行到特定的代码跑不下去了,程序员才会恍然大悟:原来这里的代码逻辑有问题.像这些在运行的时候才暴露出来的异常,又被称作“运行时异 ...