leetcode-190-Reverse Bits

news/2024/7/7 1:39:35 标签: 数据结构与算法

题目描述:

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?

 

要完成的函数:

uint32_t reverseBits(uint32_t n)

 

说明:

1、给定一个32位的无符号型整数,转化为二进制,二进制反转,再输出对应的十进制。

2、传统方法是:模仿人类思维,十进制转化为二进制,然后用栈反转输出,最后二进制再转化为十进制输出。可以完成本道题目,但是太麻烦了。

3、在计算机中,数值本身就是用二进制存储的,所以我们可以用位操作得到每一位的值,然后“或”到反转之后对应的位上面去,最后直接输出就是十进制了。

   我们这样子做,避免了十进制转化为二进制的浪费时间的操作;避免了用栈,直接“或”到uint32_t类型的数字对应的位上;最后返回的这个数字就是我们要的十进制了。

      经历了前面几道题的洗礼, 现在可以说是十分喜欢位操作了呢,感觉十分简洁。

 

代码:(笔者本人代码,实测6ms,beats 62.28% of cpp submissions)

uint32_t reverseBits(uint32_t n) 
{
    uint32_t b=1;//要“与”的数值
    uint32_t c;//存放“与”完的数值
    uint32_t d=0;//最终结果,uint32_t类型
    int index=32;
    for(int i=1;i<=16;i++)//处理后面的十六位
    {
        c=n&b;//取出每一位的值
        d|=(c<<(index-i));//把值放到相应的位上
        b<<=1;
        index--;
    }
    for(int i=17;i<=32;i++)//此时index=16,处理前面的十六位
    {
        c=n&b;
        d|=(c>>(i-index));
        b<<=1;
        index--;
    }
    return d;
}

时间复杂度是O(n),比起传统的方法快得不是一丁半点,避免了很多不必要的操作。

 

但是在discuss区,又看到了大神的更加简洁的做法,跟大家分享一下。

uint32_t reverseBits(uint32_t n) 
{
    uint32_t m = 0;
    for (int i = 0; i < 32; i++, n >>= 1)
    {
        m <<= 1;
        m |= n & 1;
    }
    return m;
}

这样做更加简洁,代码更好写。但其实原理都是一样的,只不过笔者自己的代码中使用了更多的变量,变量也有一些操作,浪费了一点时间。而大神的代码比较巧妙,使用了类似十进制数字翻转的方法,数字不断x10往前挪。

实测5ms,beats 86.90% 0f cpp submissions。

本代码来源于leetcode用户@xcv58。侵删。

 

在discuss区还看到了时间复杂度为O(logn)的做法,觉得有点厉害哈哈。分享给大家。

uint32_t reverseBits(uint32_t n) 
{
        n = (n >> 16) | (n << 16);//第一次变换
        n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8);//第二次变换。注意把数字写成二进制形式要在前面加上“0x”
        n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4);//第三次变换
        n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2);//第四次变换
        n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1);//第五次变换
        return n;
}

其实逻辑是这样的:

以四个二进制数字作为一个单位,初始化为abcdefgh

经过第一次变换,成为efghabcd

经过第二次变换,成为ghefcdab

经过第三次变换,成为hgfedcba

接着对四个二进制数字内部做反转变化,假设四个数字为abcd

经过第四次变换,成为cdab

经过第五次变换,成为dcba

至此,32位数值全部反转完成。

实测5ms,beats 86.90% 0f cpp submissions。

本代码来源于leetcode用户@tworuler。侵删。

转载于:https://www.cnblogs.com/chenjx85/p/8807707.html


http://www.niftyadmin.cn/n/838112.html

相关文章

WPF/E CTP Quick Start - 第四部分:绘图与填充(翻译)

基础元素WPF/E提供了三种基本形状元素&#xff1a;Ellipse&#xff0c;Rectangle和Line。Ellipse元素用于描述一个椭圆或者圆形。您可以通过设置它的Width和Height属性来分别控制它水平方向和垂直方向的直径。 Rectangle元素用于描述一个长方形或者正方形&#xff0c;圆角或直角…

FTP主动模式和被动模式的区别

文章来源&#xff1a;http://limssb.blog.163.com/blog/static/14730437201312582915941/ FTP主动模式和被动模式的区别 2013-02-25 20:30:45| 分类&#xff1a; obsolete|举报|字号 订阅 下载LOFTER客户端基础知识&#xff1a; FTP只通过TCP连接,没有用于FTP的UDP组件.FTP不…

多线程方式采集搜狗高清壁纸的实现

上一篇&#xff0c;完成了Windows下PHP多线程扩展pthreads的安装&#xff0c;下面就利用多线程进行图片的采集 一、实现前准备工作 1、打开搜狗图片网站 打开控制台&#xff0c;分析异步请求数据规律 2、搜狗图片存储数据表结构创建 打开搜狗异步请求链接&#xff0c;查看响应结…

More-iOS国际化一站式解决方案

关于iOS开发中的国际化&#xff08;也可称为多语言&#xff09;在网上的文章多如牛毛&#xff0c;不过总结起来就那么一回事&#xff0c;不是说他们写的不好我写的多好&#xff0c;而是说过于零散。 现在&#xff0c;我将结合实际场景需求进行国际化做法详解。可以肯定的是&…

jsp使用cookie实现记住密码的功能

文章来源&#xff1a;http://blog.csdn.net/dracowk/article/details/6887327 这个一个页面模拟的cookie 如果你要实现登录&#xff0c;当用户输入用户名密码时&#xff0c;到控制层用 Cookie user new Cookie("user",name"-"passward); 加到cookie中&am…

心医国际全网独家直播“首届人机竞技读片交流会”

2012 年&#xff0c;人工智能首次在自然图像识别领域达到人类水平&#xff1b;2013-2015年&#xff0c;通过GPU加速技术&#xff0c;人工智能快速发展&#xff0c;在各个领域上有了不凡的表现&#xff1b;2016年&#xff0c;谷歌ALphaGo更是以4&#xff1a;1 的成绩完胜世界围棋…

zabbix的setup无法进入第二步

垃圾&#xff0c;什么信息都不报&#xff0c;点击下一步返回welcome页面chmod -R 777 /var/lib/php/session

解决:type=password type=text用户名和密码输入框大小不一样 本篇文章来源于 电脑知识网(www.diannaozs.com) 原文出处:http://www.diann

文章来源&#xff1a;http://blog.csdn.net/dracowk/article/details/6887127 用户名输入框和密码输入框大小不一样&#xff1a; type"password" 这个密码输入框显示出来比type"text" 输入框宽度小&#xff0c;但是高度大&#xff0c;如何调制为一样呢&a…