映各 发表于 2025-8-18 19:33:38

家里有密码锁的注意了,这真不是 BUG,是 feature。

你好呀,我是歪歪。
前几天在网上冲浪的时候看到一个消息,关于智能密码锁的。
就是这种玩意:
当时我看到的那个消息说,开密码锁的时候,你输入的数字串只要包含你真正的密码就能开锁。
比如,假设你的密码是:250818。
那你在按密码的时候输入“123250818456”也能开锁。
怎么可能是这样的开锁逻辑呢,密码都没匹配上,门就开了,这不扯呢吗?
所以,我当时以为拍视频的人在一本正经的搞抽象呢,
直到有天晚上回家,在电梯里我突然又想起了这个段子。
于是想着验证一下。
嘿,你猜怎么着?
我开锁的时候在正确的密码前后故意多输入了几个数字,然后再按“#”,门开了。
还真不是段子。
当时我大概是这样的:
这玩意有点意思啊。
一般来说我都是用指纹解锁,但是有时候晚上出去跑步,回来之后手上都是汗,指纹识别老是失败。
这种情况下,我就会选择输入密码。
而我之前输入密码偶尔按快了,会出现按错一位的情况。
这个时候我就会轻轻的叹一口气,表示无奈,然后先输入一个“#”,让电子锁喊一声“密码错误”,再重新输入。
那天我验证了“在按#之前只要包含正确密码输入,门就能打开的这个逻辑”之后,显得我之前的一些操作像是个傻子。
同时我也兴奋的把 Max 同学叫来,给她分享了我的伟大发现。
她说:这不会是 BUG 吧?
我作为程序员,就听不得 BUG 这个东西。
于是我又浅浅的研究了一下,发现这玩意,还真是 feature,不是 BUG。
“这不是 BUG,这是 feature”,没想到这句话还真会出现在一些非狡辩的场景下。
甚至这个 feature 几乎是密码锁的标配,而这个功能还有个专门的名称叫:虚位密码。
我在购物网站上随便找一个密码锁,都有相关的介绍:
看介绍,这个功能的使用场景主要就是当有人在你旁边,你又不方便让他回避的时候,你就可以在真实的密码前面输入一些干扰项,输入的长一点,也不怕别有用心的人偷窥了。
这个功能怎么说呢?
我个人认为是聊胜于无,因为我没有这个场景。
但是如果你告诉我,在输密码的时候,自己纯纯手滑,输错了,不用按“#”,让密码锁喊一声“密码错误”,而是可以直接重新输入一遍。
那我觉得这个功能是真好用。
因为这个场景是我真有。
问题就来了

我在了解到这个现象之后,自然而然的就带入了程序员思维。
所以,那么问题就来了。
假设,现在这是一个面试的场景,面试官要求你写一个逻辑来实现上面“虚位算法”的逻辑:
//判断sourceStr中是否有targetStr
public static boolean checkStr(String sourceStr,String targetStr) {}
你会怎么搞?
首先我们来分析一下。
假设我的密码是:250818。
要判断我输入的一串数字中是否也有 250818 这个序列存在,首先可以确定的是,我们要拿到这两个输入串,然后按照字符,逐个对比。
也就是要把 sourceStr、targetStr 转化为 char[],然后在 for 循环中逐一对比每个字符是否能对上。
而且因为有两个数组,所以这个 for 循环还得是双重 for 循环。
外层循环的是什么?
因为我们是要在 sourceStr,也就是用户输入的密码里面找正确的密码,所以外层循环的肯定得是 sourceStr。
拿着输入密码的第一个字符和 targetStr,也就是正确密码的字符串对应的整个数组进行逐一比较,如果匹配上了,再拿输入密码的后续字符和正确密码进行对比,循环往复,直到对比成功,或者整个输入串对比完成。
这就对应着第二层循环的逻辑。
大体思路还是非常清晰的,但是我们还要解决一个问题:外层 for 循环的次数是多少次?
假设下面这个 for 循环就是在循环 sourceStr,也就是我们要知道这里的 max 值应该是多少?
<blockquotedata-tool="mdnice编辑器" >
for (int i = 0; i
页: [1]
查看完整版本: 家里有密码锁的注意了,这真不是 BUG,是 feature。