蓝桥算法基础2
位运算
- 按位与,x&1=x%2.因为1不论和几位二进制与,都只有最后一位为1,前面都是0,那么&前面也都为0,只有最后一位,若为1那么2的0次方为1,该数一定为奇数,与取余结果同,均为1.若为0,那么就为偶数。可以节约时间
- 按位异或,这里记住,相同数异或结果为0,不同数异或结果不为0,可以用来判断
- 移位运算符。可以求×2或÷2,也可以求2的几次幂。1<<2即将122也就是求2的2次方。依次类推。
要明确,计算机中用的是补码!!!也就是说当给定一个正数时我们就是将其转换为补码,12其二进制是1100(正数的原码反码补码都相同),此时就是先求12的相反数。其原码就是正数符号位变。通过上图可以看出在与运算时,最后只有最低位11为1,因为前面通过反码操作都不同,而后面通过补码+1将最后一位为1的进位加回来了。故x&-x可以求lowbit
- 我们可以利用它来实现一些高效的算法,比如求一个数的二进制表示中有多少个1(通过删最后一位的1,x&=(x-1)),或者维护一个数组的前缀和,快速求树状数组的层数 等等
- lowbit 也可以快速求出这个二进制数的末尾有几个0, lowbit(x) = 2^{k} ,k 则表示末尾有几个零
单纯x>>i只是右移不会改变x,所以循环可以遍历每一位
整数二分![请添加图片描述](https://i-blog.csdnimg.cn/direct/2f3cce30df194db0baa25f8ba32a1359.png)
最终推出循环一定就是l=r,所以直接判断就好啦
因为求最左边,所以当等于时仍然要往左边缩小范围,也就是<=时。
框起来的是要绑死的
这是有序区间,若最右边都小了,那么就都小了。
1e5也就是10的5次方,简写。在输入那一栏中看看输入数据的大小,然后在设置时将数设置大一些
分巧克力
这里是分巧克力,那么就要长宽都分,所以用两个去分别除比较,而不是相乘再相除。
浮点数二分(了解即可,出的少)
数的M次方根
浮点数出的少,因为误差很小,精度,但是算法没错,误差是无法确定的所以了解即可
双指针
左右指针
严格递增:这个序列中不存在任何两个数相等
快慢指针
Java中常见API
BigIntege
Arrays