二手科普的乱象

Published on 3/16/2019 8:05:11 AM

0x00 Background

知识应当是严谨的,现在越来越多的人对某件事的认知没有达到200%,而出来讲自己一知半解的东西传授给他人,这则是导致码农无法写出优秀的code的源泉。

0x01 百度百科

时间复杂度词条

首先我们知道复杂度对于常数是不敏感的,对于2n, 3n我们都可以忽略掉其中的常数2和3,比如二分查找和三份查找的时间复杂度都应当为O(logn),因为无论是以2为底还是以3为底,我们都可以通过换底公式将底数统一,然后会多出一个常数,而前面说过了常数在复杂度中是不敏感的,因此底数是常数,在复杂度中不应写底数。

0x02 LeetCode 143 Reorder List

LeetCode 143. Reorder List

我看到绝大多数百度上list出的题解,都用到了一个叫做快慢指针的东西。首先先科普一下快慢指针的正确姿势。快慢指针是用来判断链表是否带环的一种手段,它可以在O(1)的空间复杂度下判断链表是否有环,在两个指针拥有速度差且进入环的情况下,两个指针一定会相遇。而此题为了找链表的中点使用快慢指针是不恰当的。因为即便算上常数,它和我用一个for循环找到链表长度,再用一个for找中点是一样的。~ 你们说说就一简单的问题为啥非得搞个什么快慢指针出来装个屄呢??? ~

0x03 某人share的谷歌面试经历

一次谷歌面试趣事

对于素数判断是否为子串的方案简直令人可笑。我们假设Hashtable可以always以O(1)的情况找到我想要的值,对于字符串a和b而言,最坏的情况是b的字符全都被a包含,我的最坏情况就是O(a.Length + b.Length)。如果b的第一个字符就不被a包含 那么就是进行了a.Length + 1次计算。那么他所谓的素数法呢?难道不也是一样吗?我们换言之,如果这个字符串很长,我们就会因为素数相乘得到了一个巨大无比的整数,long int又能否存的下呢?题中给出了只有A-Z是合法字符,我也可以assume我的空间复杂度是常数级的。对于该选手面试被拒我只能深表惋惜,不过作为面试官表述素数法比hash优秀的依据不正确,应该challenge选手hashtable的最坏情况,选手的问题出在没能在当时反驳复杂度是一样的问题。

0x04 size_t

size_t len = strlen("blablabla");

在和一些大神合作柚子加速器项目时,由于处于各种考虑,有一大部分使用了C++进行开发,同时也暴露了我的野路子。在C++工程里,优秀的工程师们会使用size_t来接收长度变量,比如strlen之类的返回值。然而我大学四年里从来没听说过这个类型。我斗胆翻了下书、也看了下网上的视频(见1分07秒),拿int接length的case不在少数,这就是二手科普的后果。我们需要反思的是,错误的知识不断的在蔓延着。一个自己都不知道如何写出正确的code的人,写出的教程会对读者造成什么样的影响呢?同时我也庆幸没有写过C/C++相关的文章,没有成为蔓延错误知识的一份子。

0x05 Ending

求知的道路是漫长的,我们还是要对无论是书本上还是网络上的资料保持怀疑态度,坚持追求真理。如果在自己没有200%的把握了解这个知识前,继续这种二手科普,这只会造成越来越多的人写不出优秀的code。写Code要时时刻刻以相同的态度面对任何事情,无论你是在公司为公司做工程向的服务,还是为了面试去刷题,我们都应该保持统一的态度去写code,包括了代码风格、变量命名、测试用例的设计等。如果一次偷懒,就会有下一次,长此以往离优秀越来越远。不要assume在某些场景下你会注意的,因为你从来没写过优秀的code,怎么会在关键时刻写出优秀的code呢?

回想起来,其实真的是优秀的人大多不屑于分享,分享的人大多不够优秀,想起了微软的MVP,微软是一个伟大的企业,它承担了更多的社会责任,它的MVP机制以各种方式鼓励了优秀的人去分享,替受益者买了单。

Share to:

Comments

使用微信扫码