一些算法中常用的coding技巧
写一些学算法时收获的 coding 小技巧
不等于 -1
在记忆化搜索中通常会有一个 memo 数组,最初的时候 memo 会全被初始化为-1,代码中有时会这么写
1 | void dfs(int i){ |
那么这个记忆化判断部分if(memo[i][j]!=-1)
,
完全可以写成if(~memo[i][j])
.
其中的原理:-1的二进制为 1000 0001 ,其在计算机中存储为补码形式,即 1111 1111 ,~
运算取反,-1会运算成0,其他数则会运算为非0,那么if(~memo[i][j])
就是表示除了-1均通过
向下取整(仅限JavaScript)
js是弱类型语言,在进行一些运算时会进行隐式类型转换,那么来这么一个式子:x=~~x;
就可以实现向下取整,因为若右侧x为浮点数,在js中x用64位来储存,在使用位运算后,x就会变成32位整型,此时,小数点后面部分被舍弃,接着再来一次~
,就可以返回原来的数。
举个例子,
1 | x=-6.9; |
其实知道原理之后还可以使用如 x=x|0;
这样的式子来向下取整。
注意以上只能用于js,其他强类型语言会报错或者运算错误。