数独求解器

把需要求解的数独一一对照填入,就能快速求解,再也不用费劲心思苦苦冥想了,快来找几个题目验证一下程序吧。

点击这个按钮,嗖的一下,结果就出来了。

扩展阅读

舞蹈链 – JavaScript 实现

前言

如果想实现一个数独小游戏,可以先了解舞蹈链这个数据结构,还是很有意思的。我不准备再具体讲解 dance link 是什么,因为很难比其它文章写的更好,只提供一个 JavaScript 的实现在下面,如果你感兴趣的话,可以查阅,有问题可以留言讨论。

继续阅读“舞蹈链 – JavaScript 实现”

border-radius 的值超过宽高的计算公式

先来看一个现象,解释一下为何两者的圆角效果是一致的。

css 的代码如下:

.e1 {
  border-radius: 100% 100% 0 0 / 100% 0 0 0;
}

.e2 {
  border-radius: 50% 0 0 0 / 50% 0 0 0;
}

e2 好理解,水平和垂直的圆角都是 50px;但是 e1 怎么理解呢?这里就涉及到了当圆角半径超出盒宽高的计算公式了。

继续阅读“border-radius 的值超过宽高的计算公式”

我的 2022

又过了一年,例行公事般的写一篇总结。

工作

学习

在 2021 年,我做了 400 道力扣题目,截止文章写的时候,累计完成了 525 道题目,相比去年,做的题少了很多,提交数也少了很多(2021 是 1140,2022 是 428)。在 2022 年,我心底也有一个目标,就是让 medium 的题目完成的数量高于 easy 类型的,目前也没有实现,只能迁移到 2023 年了。

我也买了一些计算机基础课程,但是没有看完,太懒了。

今年还有一个长期坚持做的事情,就是听了 50 回蒋勋讲的红楼梦,虽然之前也断断续续的看过小说,但是毕竟是长篇巨作,很耗时。2023 年应该可以听完。你会发现《红楼梦》就是一场繁华青春的回忆,在追忆自己的黄金时代,而这种黄金时代,你我其实都有,每个人都能从中找到共鸣。

投机还是一直保持稳健的风格,赚了一点零花钱。刚卖出的股票,立马就涨了,会很懊恼,但是我也想明白了,有时卖掉也会立马跌,能赚能控制风险才是上策。

投资和投机的区别是,投资是靠分析,投机靠的运气。普通人因为信息差、专业能力的区别,玩的基本是投机,所以需要耐心,等待一个低的价格,再等待机会的来临。

手里还是持有 16 支亏损的基金,盈利 3 支卖出,希望今年能解套更多的基金。

想要获得更大的收益,在面临的风险不变的情况下,需要投入更多的本金,这个要视具体情况而定,根据自身的情况来。

2022 年,我称之为烂尾楼元年,不出意外地房子很多烂尾了,在七月份全国涌现出来此起彼伏的停贷潮,似乎是又一次的群众运动,从星星之火,发展出燎原之势。作为其中的一个受害者,我既看到了希望之光,又看了维权路漫漫;有过失落,对这个社会乃至国家都失落,又不甘于此,必须奋起追求自己的权益,给法律以尊严。

当有过买房的经验,再也没有说冒着三十年房贷的现实去拥有一个隔间的傻逼心思,为银行打工,为剥削者打工,甘于被洗脑。

对待房子的事情,脑子一定要清醒。

在这一年,还有一件不值得忽略的事情就是每天要做核酸,多年以后回顾这段时间,一定不能忘记。作为一个普通人的视角,可以看到这段时间似乎不那么正确,不会想再从来一次。

比起那些被封控的人,比起那些失去生命失去亲朋好友的人,我又显得很幸运。如果硬要说,我从这段经历中学到了什么,那就是如何独善自身,能生存的法则

解封了,解封了

2022-11-30

怎样理解“非暴力不合作”这句话? – 麻烦同学的回答 – 知乎

https://www.zhihu.com/question/20299344/answer/186126612

不合作运动(英语:Non-cooperation movement),印度文为Satyagraha,本义与真理有关,又译为非暴力不合作运动,1920—1922年和1930—1934年发生于英属印度全国范围。律师出身的圣雄甘地于1920年9月4日发起了不合作运动,这是世界历史上第一个全国性的非暴力反抗运动。

看文字还以为是得暴da我一顿,才能和你合作的求虐心态呢。

2022-11-29

我要做核酸

继续阅读“解封了,解封了”

leetcode 515 题解

一般来说,不想怎么写题解,因为不能穷尽所有的解法。解这个题过程中,有些有意思的地方,顺便就记录一下。原题在这里,我直接写答案了。

bfs

简单的直觉,就是广度优先遍历。拿到每层的节点,保持在数组里,再求出最大的值。

var largestValues = function(root) {
    let arr = []
    if(!root) return arr
    let stack = [root]
    while(stack.length) {
        let temp = []
        let max = -Infinity
        while(stack.length) {
            let node = stack.pop()
            let v = node.val
            max = Math.max(v, max)
            node.left && temp.push(node.left)
            node.right && temp.push(node.right)
        }

        arr.push(max)

        stack = temp
    }
    
    return arr
};

提交后,速度挺慢的,怎么回事呢?先把节点放入,再拿出来,相当于把整个树遍历了 2 次。

继续阅读“leetcode 515 题解”

flex-grow 和 flex-shrink 的计算公式

一直知道的概念是按照比例来计算,今天,朋友问起,仔细验证了一下具体的公式。比如我们先看下面的例子。

flex-grow

<div style="display:flex; width:100px;height:100px">
  <div style="width:10px;flex-grow: 5; background:red;"></div>
  <div style="width:40px;flex-grow: 2; background:blue;"></div>
  <div style="width:30px;flex-grow: 1; background:pink;"></div>
</div>

父元素的宽度是 100px,3 个子元素的宽度是 10、40、30,加起来是 80px,那么还需要剩下 20px 需要填充。每个子元素能分得多少呢?以第一个子元素为例。

5 / (5 + 2 + 1) * 20 + 10 = 22.5。第一个子元素占比 8 分之 5,乘以 20px,再加上原来的 10px,就是 22.5px。可以审查一下元素,验证我们的想法。

flex-shrink

<div style="display:flex; width:60px;height:100px">
  <div style="width:10px;flex-shrink: 5; background:red;"></div>
  <div style="width:40px;flex-shrink: 2; background:blue;"></div>
  <div style="width:30px;flex-shrink: 1; background:pink;"></div>
</div>

再看 flex-shrink。父级元素的宽度是 60px,子元素分别是 10、40、30px,加起来是 80px,那需要收缩 20px。怎么计算第一个子元素的宽度呢?如下:

10 – 5 * 10 / (10 * 5 + 40 * 2 + 30 * 1) * 20,意思是,原来子元素的宽度是 10px,它需要收缩的像素是用自身的宽度,乘以 shrink 这个权重值,再除以整个子元素的宽度乘以 shrink 权重值之和,再乘以整个收缩的 20px。

再审查元素,验证一下结果,也是对的。

我们发现了一点,grow 和 shrink 的计算方式不同,为什么呢?我觉得有 2 点。

  1. grow 这样算,很符合直觉,能够解决问题,心智模型简单。
  2. shrink 的方式更复杂一点,那是为了保证,所有的子元素塌陷后,不会出现负值,按照 grow 的算法的话就会。

以上,感谢阅读。

去 codepen 自己试一试

See the Pen flex-shrink by zeng (@zengxiaoluan) on CodePen.

算一个不成熟的算术题

和某个朋友聊天,说我买了一个便宜的房子。说到便宜这个字,我就有意见了,似乎大家都觉得买十几万一平的房子才是真的房子,才配说买了房。

现在的房子除了基本的商品属性,反而金融属性更显得重要。你卖个房子,总是要赚钱才合理,但是你想想你的房子有折旧,像汽车一样,买回来 10 万,能 20 万卖出去嘛。可见这市场已经很畸形了,在人类市场什么东西只涨不跌?

继续阅读“算一个不成熟的算术题”