C#LeetCode刷题之#190-颠倒二进制位(Reverse Bits)
问题
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4050 访问。
颠倒给定的 32 位无符号整数的二进制位。
输入: 43261596
输出: 964176192
解释: 43261596 的二进制表示形式为 00000010100101000001111010011100 ,返回 964176192,其二进制表示形式为 00111001011110000010100101000000 。
进阶:如果多次调用这个函数,你将如何优化你的算法?
Reverse bits of a given 32 bits unsigned integer.
Input: 43261596
Output: 964176192
Explanation: 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?
示例
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4050 访问。
public class Program {
public static void Main(string[] args) {
var n = 43261596U;
var res = reverseBits(n);
Console.WriteLine(res);
n = 13U;
res = reverseBits2(n);
Console.WriteLine(res);
n = 168U;
res = reverseBits3(n);
Console.WriteLine(res);
Console.ReadKey();
}
public static uint reverseBits(uint n) {
//10进制转2进制,除2取余法
var res = 0U;
var bit = 0;
var times = 32;//Math.Ceiling(Math.Log(n, 2));
//整型4字节,32位
while(n != 0) {
//10进制的1,2,3,4,5对应于2进制的1,10,11,100,101
//由于2进制的特点,末位数在1,0之间循环
//用 n 和 1 做“与运算”若值为1,必为奇数
//即除2余1
if((n & 1) == 1) {
res += (uint)Math.Pow(2, times - bit - 1);
}
bit++;
//2进制右移1位即10进制除2
n >>= 1;
}
return res;
}
public static uint reverseBits2(uint n) {
//定义结果
var res = 0U;
//执行32次
for(var i = 0; i < 32; i++) {
//将结果 *2
res <<= 1;
#line 100
//奇数时,把结果 +1
if((n & 1) == 1) res++;
//将 n 除以 2
n >>= 1;
}
//返回结果
return res;
}
public static uint reverseBits3(uint n) {
var res = 0U;
for(var i = 0; i < 32; i++) {
res <<= 1;
//res = res | (n & 1);
//奇数跟0进行“或运算”,原值
//偶数跟0进行“或运算”,原值
//奇数跟1进行“或运算”,原值
//偶数跟1进行“或运算”,原值+1
//以下一行代码相当于 #line 100 下的一行
res |= (n & 1);
n >>= 1;
}
return res;
}
}
以上给出3种算法实现,以下是这个案例的输出结果:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4050 访问。
964176192
2952790016
352321536
分析:
显而易见,reverseBits 的时间复杂度为: ,reverseBits2 和 reverseBits3 的时间复杂度为:
。
C#LeetCode刷题之#190-颠倒二进制位(Reverse Bits)的更多相关文章
- [Swift]LeetCode190. 颠倒二进制位 | Reverse Bits
Reverse bits of a given 32 bits unsigned integer. Example 1: Input: 00000010100101000001111010011100 ...
- 【leetcode刷题笔记】Number of 1 Bits
Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...
- C#LeetCode刷题-位运算
位运算篇 # 题名 刷题 通过率 难度 78 子集 67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...
- Java实现 LeetCode 190 颠倒二进制位
190. 颠倒二进制位 颠倒给定的 32 位无符号整数的二进制位. 示例 1: 输入: 00000010100101000001111010011100 输出: 0011100101111000001 ...
- LeetCode刷题专栏第一篇--思维导图&时间安排
昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...
- leetcode 刷题进展
最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多 前200的吃透了 足以应付非算法岗 ...
- LeetCode刷题指南(字符串)
作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...
- leetcode刷题记录--js
leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
- LeetCode刷题总结之双指针法
Leetcode刷题总结 目前已经刷了50道题,从零开始刷题学到了很多精妙的解法和深刻的思想,因此想按方法对写过的题做一个总结 双指针法 双指针法有时也叫快慢指针,在数组里是用两个整型值代表下标,在链 ...
随机推荐
- Python Ethical Hacking - MAC Address & How to Change(3)
SIMPLE ALGORITHM Goal -> Check if MAC address was changed. Steps: 1. Execute and read ifconfig. ...
- Python Hacking Tools - Vulnerability Scanner
Security Header website: https://securityheaders.com/ Scan the target website: https://www.hackthiss ...
- STL源码剖析:关联式容器
AVL树 AVL树定义:红黑树是一颗二叉搜索树,特别的是一棵保持高度平衡的二叉搜索树 AVL树特点: 每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1 AVL树插入: 说明:新增节点的平衡因子 ...
- coding如何绑定二次验证码_虚拟MFA_两步验证_身份验证?
Coding.net 是一个面向开发者的云端开发平台,提供 Git/SVN 代码托管.任务管理.在线 WebIDE.Cloud Studio.开发协作.文件管理.Wiki 管理.提供个人服务及企业管理 ...
- 用windbg查看dmp文件,定位bug位置
windbg + .dmp + .pdb + 源代码,可以看到是哪个代码崩溃的 设置符号文件所在路径 File->Symbol File Path... 在输入框中填入.pdb文件所在的文件夹路 ...
- vue的双向数据绑定实现原理(简单)
如果有人问你,学vue学到了什么,那双向数据绑定,是必然要说的. 我们都知道,在vue中,使用数据双向绑定我们都知道是v-modle实现的. 实现原理是通过Object.defineProperty的 ...
- set自动排序去重 stringstream流分割字符
链接:https://vjudge.net/problem/UVA-10815#author=0 题意:给几段句子,按字典序筛选出单词. 题解:用C的话太麻烦,不如用自动去重并排序的set容器.有个地 ...
- 《闲扯Redis七》Redis字典结构的底层实现
一.前言 上节<闲扯Redis六>Redis五种数据类型之Hash型 中说到 Hash(哈希对象)的底层实现有: 1.ziplist 编码的哈希对象使用压缩列表作为底层实现 2.hasht ...
- 前端学习(十七):JavaScript常用对象
进击のpython ***** 前端学习--JavaScript常用对象 JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等 在JavaScript中,对象是拥有属性和方法的数据 ...
- 一个edit的学习笔记
https://blog.csdn.net/woshizoe/article/details/51555396