20180922_ARTS_week13

Posted on 2018-09-22 in ARTS by yucongchen

第十三周,算法题 Longest Common Prefix,看了一篇讲 JavaScript 不好的地方以及如何规避的文章,记录JavaScript 在日期操作方面的小 tip,分享了对于知识付费的一些看法。

Algorithm

/**
 * Longest Common Prefix
 * https://leetcode.com/problems/longest-common-prefix/description/
 * 
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function (strs) {
    if (strs.length == 0) {
        return "";
    }

    strs.sort()  // 按字母顺序
    var len = strs.length;
    var loopCount = strs[0].length;
    var num = 0;

    for (var i = 0; i < loopCount; i += 1) {
        if (strs[0][i] == strs[len-1][i]) {
            num += 1;
        } else {
            break;
        }
    }

    return strs[0].substr(0, num);
};

console.log(longestCommonPrefix(["flower","flow","flight"]))  // fl
console.log(longestCommonPrefix(["dog", "racecar", "car"]))   // ""

这个题比较简单,用循环硬做也可以,这里做了一个小小的优化,先排序了一下,如果不排序的话,遇到 ["aaa","aa","aaa"] 这种形式就会出错。

如果不想排序,也可以先遍历一下,找到最短的那个作为循环次数。

Review

Javascript, the bad parts, and how to avoid them

https://medium.com/@Rewieer/javascript-the-bad-parts-and-how-to-avoid-them-1a7c9bc5a0dd

作者在文章中介绍了几个 JavaScript 不好的地方,比如:

类型

比如在判断一个变量是不是对象的时候,你需要 if (typeof myObject === "object" && myObject !== null),因为 null 也是个对象。关于这个的解决方案,作者推荐使用 TypeScript 和 FlowType。

数字类型

JavaScript 中的数字是双精度浮点型,这会造成一些困扰,比如

0.1 + 0.2
// 0.30000000000000004

也就是 0.1 + 0.2 === 0.3 是不成立的。 作者推荐的解决方案是使用 decimal.js

数字和字符串加法的奇怪问题

10 + "10" // "1010"

这会产生一个非常容易忽略的问题,当用户输入的时候,都是字符串型的,如果不记得做类型转换,直接做加法处理就会出错。 解决方案,当然是记得先用一堆 parseInt, parseFloat, .toString() 处理 :-)

回调地狱

关于 JavaScript 回调地狱的问题已经是老生常谈了,解决方案方面作者推荐使用 PromiseAsync/AwaitGenerator 来优化。

关于回调地狱和 Async/Await 的内容也可以参考我之前写的文章 异步多图加载这件小事儿(Promise与async)

Tip

记录几个 JavaScript 在日期操作方面的小 tip。

// 根据日期获取当前是星期几
getWeek(day) {
   const weekArr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
   return weekArr[day];
}
getWeek(new Date(x).getDay()) 

// 返回日期如果是 10 以下,在前面补 0 
function getFull(n) {
    return (n > 9 ? '' : '0') + n;
}
var x = getFull(3);  //03
var y = getFull(11);   //11

// 格式化时间
Date.prototype.Format = function (fmt) { //author: meizz
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
调用
var time1 = new Date().Format("yyyy-MM-dd");
var time2 = new Date().Format("yyyy-MM-dd hh:mm:ss");

Share

这周想分享一点对知识付费的想法。

最开始接触知识付费是从得到开始的,再到在行,知乎 Live,掘金小册,极客时间,接触这类产品也有一段时间了。最大的感想是要懂得选择,不要盲目付费。

要知道人的精力时间是有限的,花几十到几百买个专栏自己就能学会是不现实的。其实和买书一样的道理,不是你买了就会了,还需要投入大量的时间去学习实践练习,可能才能大致了解,期望仅仅通过一个专栏就获得很大提升是不现实的。

除此之外,还要特别注意知识付费产品的质量。知识付费市场现在正处于一个风口,不单单是各种产品不断涌现,各种知识输出者也想分一杯羹,造成的现象就是各种专栏或者 Live 质量参差不齐。

特别要警惕和当下热点结合的专栏,比如微信小程序。很多想学微信小程序的人可能连相关文档都没怎么看过,看到专栏就跑去买,殊不知专栏大多是把小程序文档内容大概过一遍,与其这样,不如自己啃文档自学,还能锻炼学习能力。所以最好能先看看专栏的目录,然后对应去找一些资料,看是不是很浅的东西,不要无脑买。

其实买书也是这个道理,一些书找一堆人写推荐,不一定就是因为这本书多么好。

说了挺多,感觉挺负面的,不过知识付费有其积极的作用,可以作为一个好的筛选,然后对分享者也可以产生一定的激励,做专栏可比卖书要赚的多,而且能有互动。

最后,用心学,总能学到东西的。


碎碎念

记录一些所思所想,写写科技与人文,写写生活状态,写写读书心得,主要是扯淡和感悟。 欢迎关注,交流。

微信公众号:程序员的诗和远方

公众号ID : MonkeyCoder-Life

程序员的诗和远方