备战秋招60天算法挑战,Day20

news2024/9/21 16:48:36

题目链接: https://leetcode.cn/problems/reverse-bits/

视频题解: https://www.bilibili.com/video/BV1W2421Z7bi/

LeetCode 190.颠倒二进制位

题目描述

颠倒给定的 32 位无符号整数的二进制位。

举个例子:

输入:n = 00000010100101000001111010011100
输出:964176192 (00111001011110000010100101000000)
解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
     因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。

视频题解

颠倒二进制位

思路来源

思路来源

知识回顾

  1. 左移运算符 <<,可以将一个对象的二进制向左移n位,左边n位丢弃,右边n位补0。比如,a = 1101
a << 2 = 0100
  1. 右移运算符 >>,可以将一个对象的二进制向右移n位,右边n位丢弃,左边n位补0。比如,a = 1101
a >> 2 = 0011

思路解析

方法一 按位颠倒

我们先将题目简化一下,对于一个8位的二进制10110111,如何进行颠倒成11101101呢?

先定义一个8位无符号的res = 0,我们将二进制的第i位,放到res的第7 - i位(位数从0开始)就可以完成整个过程的翻转。过程如下图:

针对上面的结论稍加修改就可以应用到32位无符号整数上面。

先定义一个存放结果的32位无符号变量 res = 0,循环遍历原串二进制的第i位,将其放到res的第31-i位,遍历完原串即得到最终翻转后的结果res

C++代码

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t res = 0;
        for (int i = 0; i < 32; ++i) {
            //原串的第i位
            int bit = n & 1;
            //将原串的第i位放到res的第31-i位
            res |= (bit << (31 - i));
            n >>= 1;
        }
        return res;
    }
};

java代码

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) {
            // 原串的第i位
            int bit = n & 1;
            // 将原串的第i位放到res的第31-i位
            res |= (bit << (31 - i));
            n >>= 1;
        }
        return res;
    }
}

python代码

class Solution:
    def reverseBits(self, n: int) -> int:
        res = 0
        for i in range(32):
            # 原串的第i位
            bit = n & 1
            # 将原串的第i位放到res的第31-i位
            res |= (bit << (31 - i))
            n >>= 1
        return res

方法二 分治

下面介绍另一种分治方法,对一些刚刷题的同学来说可能比较难理解。

  • 32位分成左右两部分16位,左右两部分交换。可以通过n = (n >> 16) | (n << 16)来做到。

  • 16位分成左右两部分8位,左右两部分交换。可以通过n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8)来做到。16进制0x00ff00ff32位二进制0000 0000 1111 1111 0000 0000 1111 1111是等价的,0xff00ff001111 1111 0000 0000 1111 1111 0000 0000是等价的。

  • 8位分成左右两部分4位,左右交换。可以通过n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4)来做到。16进制0xf0f0f0f0和二进制1111 0000 1111 0000 1111 0000 1111 0000是等价的,0x0f0f0f0f0000 1111 0000 1111 0000 1111 0000 1111是等价的。

  • 4位分成左右两部分2位,左右交换。可以通过n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2)来做到。16进制0xcccccccc和二进制1100 1100 1100 1100 1100 1100 1100 1100等价,0x33333333和二进制0011 0011 0011 0011 0011 0011 0011 0011等价。

  • 2位分成左右两部分1位,左右交换。可以通过 n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1)来实现。其中16进制0xaaaaaaaa和二进制1010 1010 1010 1010 1010 1010 1010 1010等价,0x555555550101 0101 0101 0101 0101 0101 0101 0101等价。

C++代码

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        //左右16位交换
        n = (n >> 16) | (n << 16);
        //左右8位交换
        n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8);
        //左右4位交换
        n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4);
        左右2位交换
        n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2);
        左右1位交换
        n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1);
        return n;
    }
};

java代码

public class Solution {
    // you need treat n as an unsigned value
    public int reverseBits(int n) {
        // 左右16位交换
        n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000);
        // 左右8位交换
        n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00);
        // 左右4位交换
        n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0);
        // 左右2位交换
        n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc);
        // 左右1位交换
        n = ((n >> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa);
        return n;
    }
}

python代码

class Solution:
    def reverseBits(self, n: int) -> int:
        # 左右16位交换
        n = (n >> 16) | (n << 16)
        # 左右8位交换
        n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8)
        # 左右4位交换
        n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4)
        # 左右2位交换
        n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2)
        # 左右1位交换
        n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1)
        return n

复杂度分析

时间复杂度: 两种方法都是 O(1),最多处理32位,分治是log32位,都是常量时间。

空间复杂度: 两种方法都是 O(1),只使用有限个整型变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx--简介、安装、常用命令和配置文件

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、Nginx简介 1、nginx介绍 Nginx (engine x) 是一个高性能的 HTTP 和 反向代理 服务&#xff0c;也是一个IMAP/POP3/SMTP服务。因它的稳定性、丰…

分布式锁实现方案--redis、zookeeper、mysql

分布式锁的几种实现方式 悲观锁和乐观锁分布式锁的实现要求 -- 互斥性、避免死锁、可重入性、高可用行、性能互斥-只能有一个客户端持有锁 -- redis setnx避免死锁引入过期时间 -- redis ttl锁过期问题 -- 自动续期 -- redis释放别人锁问题 -- 锁附加唯一性 -- 给每个客户端设置…

【嵌入式linux开发】智能家居入门6:最新ONENET,物联网开放平台(QT、微信小程序、MQTT协议、ONENET云平台、旭日x3派)

智能家居入门6&#xff1a;最新ONENET物联网开放平台 前言最终现象一、ONENET云平台创建产品与设备二、使用MQTT客户端软件测试2.1 测试前的准备2.2 测试 三、LInux QT代码四、onenet 云端API介绍及微信小程序代码4.1 onenet API介绍4.2 微信小程序代码 五、板端运行 前言 ONE…

LeetCode 热题100-24

回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff…

四层负载企业实战

通过四层负载LVSkeepalived将请求转发到nginx代理服务器。通过代理服务器访问后端真实应用服务。 拓补图&#xff1a; 准备环境6台机器&#xff1b; lvskeepalived---两台 nginx代理 ---两台 tomcat----一台 php ----一台 所有机器关闭防火墙和selinux 所有机器解析如下…

APP安全检测报告内容详解

一、APP安全检测的必要性 APP安全检测是确保移动应用安全的重要一环。在开发过程中&#xff0c;由于技术、人员和管理等方面的原因&#xff0c;APP可能存在各种安全漏洞和风险。这些漏洞一旦被黑客利用&#xff0c;可能导致用户数据泄露、恶意代码注入、应用被篡改等严重后果。…

Windows下使用QT5.14.2编译MySQL8.0对应的最新64位驱动程序步骤

不得不说mysql更新的速度是真的快&#xff0c;最近一两年都更新了好几个的小版本了。如果安装了高版本的 mysql软件&#xff0c;低版本的驱动就不支持了&#xff0c;因此需要重新使用QT来编译对应的mysql驱动。具体办法如下&#xff1a; 1、官网下载最新的mysql8.0安装包。下载…

day04--js的综合案例

1.1 商品全选 需求&#xff1a;商品全选 1. 全选 &#xff1a;点击全选按钮,所有复选框都被选中 2. 全不选 &#xff1a;点击全不选按钮,所有复选框都被取消选中 3. 反选 &#xff1a; 点击反选按钮,所有复选框状态取反 <!DOCTYPE html> <html lang"en">…

智慧校园云平台电子班牌系统源码,智慧教育一体化云解决方案

智慧校园云平台电子班牌系统&#xff0c;利用先进的云计算技术&#xff0c;将教育信息化资源和教学管理系统进行有效整合&#xff0c;实现生态基础数据共享、应用生态统一管理&#xff0c;为智慧教育建设的统一性&#xff0c;稳定性&#xff0c;可扩展性&#xff0c;互通性提供…

利用PDAL库实现Las文件向PLY文件的转换

1、官网的下载链接 PDAL&#xff08;Point Data Abstraction Library&#xff09;是一个开源的C库&#xff0c;专门用于处理三维点云数据。它提供了数据读取、转换、过滤、统计分析等多种功能&#xff0c;支持多种数据格式&#xff0c;如LAS、LiDAR、ASCII等。在IT行业中&…

Java常用集合(List、Map)类型相关问题整理

一、背景 针对Java基础集合的部分&#xff0c;对一些常见的问题进行整理&#xff0c;方便后续能够随时复习 二、问题与回答 &#xff08;1&#xff09;Java集合类ArrayList初始化时数组的默认长度是多少&#xff1f; 答&#xff1a;在new ArrayList() 这段代码执行完后&a…

类Unix环境在Windows上的演进史

自从以Unix为基础的操作系统被发明以来&#xff0c;尝试在Windows环境中模仿Unix操作的工具就一直存在。这种需求源于许多原因&#xff0c;包括Unix对脚本和命令行工具的强大支持&#xff0c;以及Unix和Linux系统在科学、工程和其他技术领域的广泛使用。下面就让我们一起探讨下…

input[type=checkbox]勾选框自定义样式

效果图&#xff1a; <template> <input class"rule-checkbox" type"checkbox" checked v-model"isChecked" /> </template><script setup lang"ts"> import { ref } from vue; const isChecked ref(); </…

应急响应-DDOS-技术指南

初步预判 通常&#xff0c;可从以下几方面判断服务器/主机是否遭受DDoS攻击查看防火墙、流量监控设备、网络设备等是否出现安全告警或大量异常数据包。如图所示&#xff0c;通过流量对比&#xff0c;发现在异常时间段存在大量UDP数据包&#xff0c;并且与业务无关。 通过安全设…

猫毛还是满天飞?宠物空气净化器是个好帮手

家里养了几只可爱的小猫咪&#xff0c;每天都想它们贴贴&#xff0c;有时候看到它们这么可爱的待在家里&#xff0c;都不想出门上班了。每天睁眼是它们&#xff0c;闭眼前也是它们&#xff0c;只要我待在家里&#xff0c;它们就和我一起挪动&#xff0c;好像身边多了几只可爱的…

qt-12工具盒(ToolBox)

工具盒--ToolBox drawer.hdrawer.cppmain.cpp运行图 drawer.h #ifndef DRAWER_H #define DRAWER_H #include <QWidget> #include <QToolBox> #include <QToolButton> #include <QGroupBox> #include <QVBoxLayout>class Drawer : public QToolB…

机械学习—零基础学习日志(如何理解线性代数5)

零基础为了学人工智能&#xff0c;正在快乐学习&#xff0c;每天都长脑子 特征向量和特征值 我们知道&#xff0c;线性映射&#xff0c;也就是矩阵&#xff0c;其实就是平面的一种变换。 但是在矩阵变换过程中&#xff0c;我们会发现有一个方向上&#xff0c;变化方向会与x的…

Python 函数式编程 内置高阶函数及周边【进阶篇 3】推荐

前面我们已经总结并实践了用python获取到了数据。也介绍了python中http网络请求的几种方式&#xff0c;正在学习python开发语言或者对python3知识点生疏需要回顾的请点这里 &#xff0c;本章主要总结了函数式编程及特点 和 python中内置的高阶函数及周边知识&#xff0c;方便自…

Scout Suite:开源云安全审计工具

Scout Suite 是一个开源、多云安全审计工具&#xff0c;旨在评估云环境的安全态势。 Scout Suite 利用云供应商提供的 API 来收集和整理配置数据&#xff0c;从而更轻松地识别潜在风险。 Scout Suite 无需手动筛选云 Web 控制台上的大量页面&#xff0c;而是会自动生成全面清…

ObjectUtils.nullSafeEquals你真的用对了吗?

目录 引言排查思考 引言 在写代码时&#xff0c;我们通常喜欢使用org.springframework.util.ObjectUtils#nullSafeEquals来比较两个对象是否相等&#xff0c;从而避免使用equals方法在对象为空时导致空指针异常。 最近在写代码时&#xff0c;我试图使用stream流的filter&#…