一道算法和一些(我认为有趣的)开源项目

这周的内容有点水,简单分享下这周学到的东西。

算法

LC 342 - Power of 4 without loop/recursion

这个题目有点意思。抛开 1(0x0000 0001) 这个例外,像 4(0x0000 0100)16(0x0001 0000)64(0x0100 0000) 可以观察到二进制形式下很有规律,只有一位是 1,接下来跟着偶数个 0 (否则就是 2 的幂)。代码参考自 https://www.geeksforgeeks.org/find-whether-a-given-number-is-a-power-of-4-or-not/

a) There is only one bit set in the binary representation of n (or n is a power of 2)

b) The bits don’t AND(&) any part of the pattern 0xAAAAAAAA

/**
 * @param {number} num
 * @return {boolean}
 */
var isPowerOfFour = function(num) {
    return (num != 0) && ((num&(num-1)) == 0) && !(num & 0xAAAAAAAA);
};

解释:

  1. (num&(num-1)) == 0 先过滤出来 2 的幂,例如 2&1 (0x10 & 0x01),以及 4&3 (0x0100 & 0x0111)
  2. 对于 4 的幂,1 必须出现在奇数位上,而 A (0x1010) 的 1 均出现在偶数位上

开源项目

博客首页摘要的算法

虽然 Liquid 提供了 truncate 以及 truncatewords API,但是对于中文效果不理想,另一方面如果截断的地方有特别的 css 样式,那么对于何时关闭的处理简直是。。。

参考了 http://kingauthur.info/2013/01/20/the-paginator-and-excerpt-in-jekyll/ 的实现,摘录如下:

{{ post.content | split:'<!--break-->' | first}}

借助了 split API,在正文手动插入 <!--break--> 来控制,更为自由、安全。

另外,为了防止 {{foo | bar}} 渲染的时候被误认为是 Liquid 指令,可以使用 raw 标签。

其他

Dota 2 TI9 抢票开始了,结果… 自然是没抢到啦。意外了解到大麦网的 bug,只要知道活动的 id 就能直接进入支付页面,sad…

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 IronBlood(包含链接)。