朝花夕拾之二进制算法

   不知不觉已经做了3年的程序员,每天忙于业务逻辑的实现。写的最多的不过是crud。现在回想自己初入职场时,回答领导的职业规划时,大言不惭的说想从事技术。不禁觉得可笑。回顾三年的工作,除了框架和中间件的使用信手拈来外,没有任何技术积累。甚至发现编程知识的地基都开始摇摇欲坠。我觉得不能这样了。所以从今天开始,从头学习算法,即为了跳槽,又为了曾经的承诺。

二进制基础

二进制的基本运算:
6种位运算:非、与、或、异或、左移、右移
其中左移右移具体包含以下几种运算符:
左移运算符:<< m<<n表示把m左移n位,左边的n位被丢弃,右边n位补0
右移运算符:>> m>>n表示把m右移n位,右边n位被丢弃。整数的话,左边n位补0,负数 的话,左边n位补1
无符号右移运算符:>>> m>>>n表示m右移n位,无论该数是整数还是负数,都会在左边补0

神奇公式

  1. i&(i-1) 表示把i的二进制数中最右边的1变为0
  2. i&1 等价于i%2但计算速度更快
  3. 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时,说明该字母重复。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值