这是悦乐书的第185次更新,第187篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第44题(顺位题号是190)。给定32位无符号整数,求它的反转位。例如:

输入:43261596

输出:964176192

说明:43261596以二进制表示为00000010100101000001111010011100,

964176192以二进制表示为00111001011110000010100101000000。

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

02 第一种解法

既然是做位运算,那么依次将原数从左往右移动一位,取出移动的位判断是0还是1,然后加到反转的结果上,并且反转的结果是从右往左移动一位,循环控制的次数为32次,因为是32位整数。

其中涉及到左移、右移、与(&)运算,与(&)运算的规则是相同的位上均为1时结果为1,否则结果为0,而左移、右移的规则就是从右往左补0和从左往右补0了。

public int reverseBits(int n) {
int result = 0;
for (int i=0; i<32; i++) {
if ((n & 1) == 1) {
result = (result << 1) + 1;
} else {
result = result << 1;
}
n = n >> 1;
}
return result;
}

03 第二种解法

可以将上面的步骤再简化下,进入循环时,无论原数右移出来的位是0还是1,都需要结果值左移一位,对此我们可以进行或(|)运算操作。

先将结果值左移一位,然后计算n和1的与(&)运算结果,再将两数做或(|)运算,如果n和1的与(&)运算结果为1,那么结果值就加1,为0就加0。

或(|)运算的规则是当两边操作数的位有一边为1时,结果为1,否则为0。

public int reverseBits2(int n) {
int result = 0;
for (int i = 0; i < 32; i++) {
result = (result << 1) | (n & 1);
n >>= 1;
}
return result;
}

04 第三种解法

先将原数转为二进制字符串,再利用StringBuilder的reverse方法得到反转的二进制字符串,再将二进制字符串变为整数返回。

public int reverseBits3(int n) {
String inputBinary = this.decimalToBinary(n);
String reversedInputBinary = new StringBuilder(inputBinary).reverse().toString();
return this.binaryToDecimal(reversedInputBinary);
} private String decimalToBinary(int n) {
StringBuilder sb = new StringBuilder();
while (Integer.compareUnsigned(n, 0) > 0) {
sb.append(Integer.remainderUnsigned(n, 2));
n = Integer.divideUnsigned(n, 2);
}
while (sb.length() < 32) {
sb.append('0');
}
return sb.reverse().toString();
} private int binaryToDecimal(String str) {
int res = 0;
for (char c: str.toCharArray()) {
res *= 2;
res += c == '0' ? 0 : 1;
}
return res;
}

05 第四种解法

利用包装类Integer自带的方法,reverse()方法即可反转原数。

public int reverseBits4(int n) {
return Integer.reverse(n);
}

06 小结

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

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

LeetCode算法题-Reverse Bits(Java实现)的更多相关文章

  1. LeetCode算法题-Reverse Words in a String III(Java实现)

    这是悦乐书的第259次更新,第272篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第126题(顺位题号是557).给定一个字符串,您需要反转句子中每个单词中的字符顺序,同 ...

  2. LeetCode算法题-Reverse String II(Java实现)

    这是悦乐书的第256次更新,第269篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第123题(顺位题号是541).给定一个字符串和一个整数k,你需要反转从字符串开头算起的 ...

  3. LeetCode算法题-Reverse String(Java实现)

    这是悦乐书的第205次更新,第217篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第73题(顺位题号是344).编写一个以字符串作为输入并返回字符串的函数.例如: 输入: ...

  4. LeetCode算法题-Reverse Vowels of a String(Java实现-四种解法)

    这是悦乐书的第206次更新,第218篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第74题(顺位题号是345).编写一个函数,它将一个字符串作为输入,并仅反转一个字符串的 ...

  5. LeetCode算法题-Reverse Linked List(Java实现)

    这是悦乐书的第192次更新,第195篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第51题(顺位题号是206).反转单链表.例如: 输入:1-> 2-> 3- ...

  6. 【算法】LeetCode算法题-Reverse Integer

    这是悦乐书的第143次更新,第145篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第2题(顺位题号是7),给定32位有符号整数,然后将其反转输出.例如: 输入: 123 ...

  7. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

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

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

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

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

随机推荐

  1. Go基础系列:构建go程序

    hello world 从一个简单的程序开始解释,将下面的内容放进test.go文件中,路径随意: package main import ( "fmt" ) func main( ...

  2. Go基础系列:常量和变量

    常量(Constants)和iota 常量包含不会发生更改的数据.常量的数据类型只能是boolean.number(int/float/complex)或string. 定义方式: const NAM ...

  3. 解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page1-6

    前言 大家好.这是开通本号的第一篇文章.从事IT行业已经20年了,从使用PowerBuilder做企业信息系统开始,做了七八年开发,然后转型Java不是很成功,从07年之后,我转做产品经理,机缘巧合, ...

  4. Django 系列博客(七)

    Django 系列博客(七) 前言 本篇博客介绍 Django 中的视图层中的相关参数,HttpRequest 对象.HttpResponse 对象.JsonResponse,以及视图层的两种响应方式 ...

  5. SpringBoot学习(八)-->SpringBoot之过滤器、监听器

    本文将直接使用@WebFilter和@WebListener的方式,完成一个Filter 和一个 Listener. 过滤器(Filter)和 监听器(Listener)的注册方法和 Servlet ...

  6. 第一册:lesson ninety-three。

    原文:  our new neighbor. Nigel is our new next-door neighbor. He is a pilot. He was in the R.A.F. He w ...

  7. DropDownList按照Gridview获取数据获取到的是定义格式

    首先需要把DropDownList改成允许服务器返回. 然后绑定的时候需要以下两项. DropDownList1.DataTextField = "name";DropDownLi ...

  8. UML 序列图

    序列图      序列图主要用于按照交互发生的一系列顺序,显示对象之间的这些交互.显示不同的业务对象如何交互,对于交流当前业务如何进行很有用.序列图是一个用来记录系统需求,和整理系统设计的好图.序列图 ...

  9. 从零开始学安全(二十一)●PHPSPL异常

  10. [android] android消息机制入门

    上一节,先把访问网络的部分放到一个子线程里面去执行,new Thread(){}.start(),new Thread直接使用匿名内部类来实现,重写run()方法,内部类访问外部的变量,这个变量应该定 ...