不知不觉已经做了3年的程序员,每天忙于业务逻辑的实现。写的最多的不过是crud。现在回想自己初入职场时,回答领导的职业规划时,大言不惭的说想从事技术。不禁觉得可笑。回顾三年的工作,除了框架和中间件的使用信手拈来外,没有任何技术积累。甚至发现编程知识的地基都开始摇摇欲坠。我觉得不能这样了。所以从今天开始,从头学习算法,即为了跳槽,又为了曾经的承诺。
二进制基础
二进制的基本运算:
6种位运算:非、与、或、异或、左移、右移
其中左移右移具体包含以下几种运算符:
左移运算符:<< m<<n表示把m左移n位,左边的n位被丢弃,右边n位补0
右移运算符:>> m>>n表示把m右移n位,右边n位被丢弃。整数的话,左边n位补0,负数 的话,左边n位补1
无符号右移运算符:>>> m>>>n表示m右移n位,无论该数是整数还是负数,都会在左边补0
神奇公式
- i&(i-1) 表示把i的二进制数中最右边的1变为0
- i&1 等价于i%2但计算速度更快
- i^i=0
算法实战
题目一:
输入一个非负整数,计算该数的二进制形式中1的个数
这里我们用到了神奇公式1.
解题代码如下:
publlic int countBits(num) {
int reuslt=0;
while(num!=0){
result++;
num=num&(num-1);
}
return result;
}
题目二:
输入一个整数数组,数组中只有一个元素出现了1次,其余都出现了两次,请找出只出现一次的元素。
public int singleNumber(int [] a){
int length=a.length;
int i=a[0];
for(int j=1;j<length;j++){
i=i^a[j];
}
return i;
}
题目三
输入一个字符串数组,计算不包含相同字符的两个字符串的长度的乘积的最大值。字符串只包含小写英文。如果所有字符串都包含至少一个相同字符,则返回0
解题思路,将一个字符串转换为一个二进制数,如果该字符串包含a,则最右以为为1,否则为0,依次类推,我们可以通过与运算,当某位是0时,说明该位对应的字母不重复。当某位为1时,说明该字母重复。