博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Leetcode] Reverse Bits 反转位
阅读量:5911 次
发布时间:2019-06-19

本文共 1970 字,大约阅读时间需要 6 分钟。

Reverse Bits

Reverse bits of a given 32 bits unsigned integer.

For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as 00111001011110000010100101000000).

Follow up: If this function is called many times, how would you optimize it?

移位法

复杂度

时间 O(1) 空间 O(1)

思路

最简单的做法,原数不断右移取出最低位,赋给新数的最低位后新数再不断左移。

代码

public class Solution {    // you need treat n as an unsigned value    public int reverseBits(int n) {        int res = 0;        for(int i = 0; i < 32; i++, n >>= 1){            res = res << 1 | (n & 1);        }        return res;    }}

分段相或法

复杂度

时间 O(1) 空间 O(1)

思路

Java标准的Integer.reverse()源码。

代码

public class Solution {    // you need treat n as an unsigned value    public int reverseBits(int i) {        i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;        i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;        i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;        i = (i << 24) | ((i & 0xff00) << 8) | ((i >>> 8) & 0xff00) | (i >>> 24);        return i;    }}

后续 Follow Up

Q:如果该方法被大量调用,或者用于处理超大数据(Bulk data)时有什么优化方法?

A:这其实才是这道题的精髓,考察的大规模数据时算法最基本的优化方法。其实道理很简单,反复要用到的东西记下来就行了,所以我们用Map记录之前反转过的数字和结果。更好的优化方法是将其按照Byte分成4段存储,节省空间。

// cacheprivate final Map
cache = new HashMap
();public int reverseBits(int n) { byte[] bytes = new byte[4]; for (int i = 0; i < 4; i++) // convert int into 4 bytes bytes[i] = (byte)((n >>> 8*i) & 0xFF); int result = 0; for (int i = 0; i < 4; i++) { result += reverseByte(bytes[i]); // reverse per byte if (i < 3) result <<= 8; } return result;}private int reverseByte(byte b) { Integer value = cache.get(b); // first look up from cache if (value != null) return value; value = 0; // reverse by bit for (int i = 0; i < 8; i++) { value += ((b >>> i) & 1); if (i < 7) value <<= 1; } cache.put(b, value); return value;}

转载地址:http://uztpx.baihongyu.com/

你可能感兴趣的文章
Eclipse修改log缓冲大小
查看>>
C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件
查看>>
RESTful与网络请求过程
查看>>
.NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了
查看>>
vue插槽slot
查看>>
日历类报表可以这样实现
查看>>
CirruScript 写的: 函数式编程另类指南
查看>>
Java 获取文件的上级目录
查看>>
Confluence 6 CSS 编辑快速入门
查看>>
我要做 Android 之消息机制
查看>>
极简的高性能框架 one 1.4.6 发布,新增参数验证器
查看>>
推荐两个漂亮的编程字体
查看>>
Linux系统诊断小技巧(14):启停问题之如何修复initrd损坏
查看>>
Python数据科学分析速查表
查看>>
jmeter测试教程
查看>>
Trie 树内存消耗问题
查看>>
区块链教程btcpool矿池源码分析slparser
查看>>
OC 中,覆盖属性会有怎么样的化学反应?
查看>>
Linux MySQL 8.0 忘记密码
查看>>
Android:随笔——我们用什么来替代 Enum 这个内存大户
查看>>