LeetCode- Bit Manipulation LeetCode总结(1) —— 位运算

来源:互联网 发布:玄空飞星软件下载 编辑:程序博客网 时间:2024/05/18 00:43
Bit Manipulation(位运算):主要思想参考《剑指Offer》第二章2.4.3节。
       一共五种运算:与,或,异或,左移,右移。
 
常用技巧:
(1)n & (n-1)能够消灭n中最右侧的一个1。
(2) 右移:除以2, 左移:乘以2。
(3)异或性质:交换律,0^a=a, a^a=0;
(3)将常用字符、数字等均转为按位运算,可以节约空间。

LeetCode题目解析

191    Number of 1 Bits    http://blog.csdn.net/xsloop/article/details/46997851
  1. 使用右移。
  2. 使用n&(n-1)可以消灭一个1的性质来求解。

231    Power of Two           http://blog.csdn.net/xsloop/article/details/47000827
                使用n&(n-1)=0来判断。
                注意0和负数的情况。

190    Reverse Bits               http://blog.csdn.net/xsloop/article/details/47000917
                使用右移和左移。

169    Majority Element    http://blog.csdn.net/xsloop/article/details/46999037
             求解出现次数大于n/2的数字。
    •  按照顺序循环,如果两个元素不相等,则删除这两个元素。则剩下的为出现大于n/2次的那个元素。
    •  使用sort的解决方法,耗时48ms。
    •  不进行实质的删除操作,只是做mark而已。
    •  位运算方法:统计32位每个位上出现1的次数大于n/2的,如果是则直接赋值为1,否则为0。

  • 其他算法


136    Single Number        http://blog.csdn.net/xsloop/article/details/46998819
            数组中,只有一个数出现一次,其余数均出现两次。求出现一次的那个值。
            了解异或的三个性质:
            //主要思想:  
       //   异或满足交换律,a1 ^ a2 ^ .... ^ an ^ a1 ^ .... ^ an-1 = (a1^a1)^(a2 ^a2) ^(....) ^(an-1 ^ an-1) ^ an  
       //    a ^ a = 0;  
       //    a ^ 0 = a;  
        显然将所有数字异或后,得到的结果即为出现一次的值。

        扩展:
                有两个出现一次的数字,其余都出现两次。找出这两个出现一次的数字。
  1. 将所有数字做异或运算,按照异或结果中1的位置将数组分成两组。(因为1的位置表示有不同的取值)
  2. 对两组分别求一次异或,值不为0,则为求得的结果。

137    Single Number II    http://blog.csdn.net/xsloop/article/details/47000471
            找出现一次的元素,其余元素均出现三次。
            将每个元素的每一位分别相加,取模3,则会得到该位的取值,原理类似于(3(a1+a2+...+an)+a)%3 = a;
        
            扩展:
            可以扩展到K(元素出现K次,只有一个出现一次)的做法:
                    1、K为偶数:参考 Single Number 的做法;
                    2、K为奇数:参考 Single Number II 的做法;

78      Subsets                         http://blog.csdn.net/xsloop/article/details/47003033
            求全组合。
            对于全组合,也就是对于N个元素,如果元素出现则用1表示,不出现则用0;
            那么,得到的组合序列是2^N, 其中0表示所有元素都不取,1表示只取第一个,。。。。。
            这样可以位运算的方法得到一个数组中的所有组合。

201    Bitwise AND of Numbers Range     http://blog.csdn.net/xsloop/article/details/47002421
            给两个数M, N, (0<=M <=N<=INT_MAX),求M,N中所有数字的按位与运算。
            将M和N分别按位移动,直到M和N相等,记录移动的位数count,则返回值为M<<count;
            如果M和N始终不相等,则返回0;

187    Repeated DNA Sequences                   http://blog.csdn.net/xsloop/article/details/47004769
            使用位运算计算DNA序列中重复的10个字符组合。
            DNA只有四个字符,分别用00, 01, 10, 11表示;
            10个字符需要2^20位,2^20 = 1024 *1024,则只需要即可1024*1024的哈希表即可。
             对于字符串,从头开始以10个字符为单位,统计出现的结果放入哈希表中,当出现次数大于1则保存到重复dna序列中。


0 0
原创粉丝点击