摘要:今天看到一个帖子,楼主说,中午吃饭,leader突然跟他说;跟你说个事儿,你做好心里准备,我可能要离开了。楼主表示明明一个月前还信誓旦旦说:既然把你招进来了,一定会把你带起来的。再也不信男人的鬼话了。
大家好,我就是那个在B站讲算法的「华南溜达虎」。
职场最扎心的事,不是被裁员,也不是被PUA,而是那个护你周全、带你成长的好领导突然说要走。
今天看到一个帖子,楼主说,中午吃饭,leader突然跟他说;跟你说个事儿,你做好心里准备,我可能要离开了。楼主表示明明一个月前还信誓旦旦说:既然把你招进来了,一定会把你带起来的。再也不信男人的鬼话了。
楼主之所以对leader这么不舍,是因为这位leader没有管理层的架子,像平级一样自在。面对员工的“蠢问题”,他耐心解答;面对+2的push,他默默挡枪;对自己负责的项目,他做到极致。
能扛事、情绪稳定、有硬实力的领导确实难得,大家有没有遇到过这种leader?欢迎评论区分享。
言归正传,今天我们来分享一道高频面试题「颠倒二进制位」。
颠倒给定的 32 位无符号整数的二进制位。
举个例子:
输入:n = 00000010100101000001111010011100输出:964176192 (00111001011110000010100101000000)解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596, 因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。方法一 按位颠倒
我们先将题目简化一下,对于一个8位的二进制10110111,如何进行颠倒成11101101呢?
先定义一个8位无符号的res = 0,我们将二进制的第i位,放到res的第7 - i位(位数从0开始)就可以完成整个过程的翻转。过程如下图:
针对上面的结论稍加修改就可以应用到32位无符号整数上面。
先定义一个存放结果的32位无符号变量 res = 0,循环遍历原串二进制的第i位,将其放到res的第31-i位,遍历完原串即得到最终翻转后的结果res。
python代码
class Solution: # @param n, an integer # @return an integer def reverseBits(self, n): res = 0 for i in range(32): # 原串的第 i 位 bit = n & 1 # 将原串的第 i 位放到 res 的第 31-i 位 res |= (bit >= 1 return res方法二 分治
下面介绍另一种分治方法,对一些刚刷题的同学来说可能比较难理解。
把32位分成左右两部分16位,左右两部分交换。可以通过n = (n >> 16) | (n 来做到。
把16位分成左右两部分8位,左右两部分交换。可以通过n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) 来做到。16进制0x00ff00ff和32位二进制0000 0000 1111 1111 0000 0000 1111 1111是等价的,0xff00ff00和1111 1111 0000 0000 1111 1111 0000 0000是等价的。
把8位分成左右两部分4位,左右交换。可以通过n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) 来做到。16进制0xf0f0f0f0和二进制1111 0000 1111 0000 1111 0000 1111 0000是等价的,0x0f0f0f0f和0000 1111 0000 1111 0000 1111 0000 1111是等价的。
把4位分成左右两部分2位,左右交换。可以通过n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) 来做到。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) 来实现。其中16进制0xaaaaaaaa和二进制1010 1010 1010 1010 1010 1010 1010 1010等价,0x55555555和0101 0101 0101 0101 0101 0101 0101 0101等价。
class Solution: # @param n, an integer # @return an integer def reverseBits(self, n): # 左右16位交换 n = (n >> 16) | (n > 8) | ((n & 0x00ff00ff) > 4) | ((n & 0x0f0f0f0f) > 2) | ((n & 0x33333333) > 1) | ((n & 0x55555555)时间复杂度: 两种方法都是 O(1),最多处理32位,分治是log32位,都是常量时间。
空间复杂度: 两种方法都是 O(1),只使用有限个整型变量。
今天的分享就到这里,希望大家有所收获!
特别声明:以上内容仅代表作者本人的观点或立场,不代表新浪财经头条的观点或立场。如因作品内容、版权或其他问题需要与新浪财经头条联系的,请于上述内容发布后的30天内进行。
来源:新浪财经