在leetcode中掌握到的[长期更新]

来源:互联网 发布:如何破解软件试用期 编辑:程序博客网 时间:2024/05/29 09:36

2017/1/24

461.hamming distance

①.C++函数返回数组

数组不是一种类型,不能直接返回。需要返回数组的指针:

int* returnArray(){    int *a;    a=new int [100];    return a;}int main(){    int *a=returnArray();}

②.

a=i++;//将i的值赋值给a,即a=i;然后再执行i=i+1;也就是【a=i++;】与【a=i; i=i+1;】等价。
a=++i;//将i+1的值赋给a,即a=i+1;然后再执行i=i+1;也就是【a=++i;】与【a=i+1;i=i+1;】等价。
单独使用时,++i效率更高。
③.
判断一串二进制数a中1的个数:
a&=a-1直到a=0,与运算的次数即为所求。
原理:不断去除二进制数位于最低位的1,那a&(a-1)为什么可以做到这一点呢?请考虑一个二进制数n,如果它的最右端的1在第k个位置,n-1后k位置变0,k左边的数不变,k右边的0变为1,与运算后可以将n的最右端的1变为0。
位运算符:& | ^ >> <<
应用:涉及到二进制运算时,例如判断一个数是否为奇/偶,末尾是否为0,是否被2整除:if(a&1==0)
⑤.针对本题:
汉明距离实际上是两个二进制数中不同位数的个数,求解时可以将两数异或,再利用③的方法得出结果中1的个数。

476.number complement
又是一道与二进制数位计算有关的题目,这种题用位运算来处理可以提高运行效率,但是思维比较难。
如果只用~按位取反的话,得到的是一个补码表示,例如101取反,得到11111010,结果是-6;而题目要求得到的是00000010,结果是2。
对于这种需要部分求反的情况,可以采用以下异或的方法:
先想想一个二进制数与全1异或,得到的是它的反,与全0异或,得到的是它本身。那么我们可以构造一个二进制数:需要取反的位是1,不需要取反的位是0。
那要如何构造这样一个数呢?这里有两种方法:1.首先要知道需要取反的所在位置,将操作数依次右移,每右移一次,将0001左移一次,然后减去1,这样可以得到右边对应的位全为1的二进制数。2.还可以声明一个无符号数11111111,同样将其左移相应位数,再进行取反即可得到。
构造出这样一个二进制数,将其与原操作数异或,便可得到所求结果。

485.max consecutive 1s
vector结构相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.
例:声明一个int向量以替代一维的数组:vector <int> a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除)。用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,所以只要声明一个地址的向量即可,即:vector <int *> a.同理想用向量代替三维数组也是一样,vector <int**>a;再往上面依此类推.


1 0