Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2021-06-01 #8

Open
JunQu opened this issue Jun 2, 2021 · 3 comments
Open

2021-06-01 #8

JunQu opened this issue Jun 2, 2021 · 3 comments
Assignees
Labels
Milestone

Comments

@JunQu
Copy link
Owner

JunQu commented Jun 2, 2021

Algorithm

股票的买卖问题

121.Best Time to Buy and Sell Stock

这个题目是给你当股神的机会🐶。只能购买一次,只能按顺序往后买,而且你只有一次购买的机会,需要你选出最大的那个收益。
乍看之下需要不断的组合元素来达到最大的差值,稍微细想就会发现,每次肯定是最小的和最大的差值,而且只能是后面的减去的前面的(收益),所以我需要在前部分确定最小值,再慢慢寻找最大值就可以得到最大的收益,这个题目相信是真正的简单的:

const maxProfit = function(prices) {
    let ret = 0;
    let small = Infinity;
    for(const price of prices) {
        if (small > price) {
            small = price; // 寻找前部分最小值
        }
        if (price - small > ret) {
            ret = price - small; // 最大收益通过差值的比较
        }
    }
    return ret;
}

这题目稍加思考就可以得出答案,是简单题目的典型题目,果然我还是适合简单的题目。

122. Best Time to Buy and Sell Stock II

紧接着就是上一道题目的变体,感觉难度有点增加了。重新思考🤔,因为这是给你多次机会去购买,和一次机会的思维是不一样,多次买入卖出,按照我对市场的理解,我希望涨了就是我买的,跌了永远都不是我的,我买到的永远是涨的。这里注意的是把涨的部分都攒起来,那就是所有涨过的部分,也就是最大收益,突然想到这点后,我立刻就完成了代码。

const maxProfit = function(prices) {
    let ret = 0;
    for(let i=0; i < prices.length - 1;i++) {
        const val = prices[i+1] - prices[i];  // 判断下一次是涨是跌
        if(val > 0) {
            ret+=val; // 我只要涨的部分
        }
    }
    return ret;
};

其实这道题目也很简单,特别经历过去年的股市的人都懂。但是如果一开始做题目的是121而不是122的话,那么思维很可能就会被影响, 多次购买追求的总的收益最大化和单次收益最大化是完全不一样的,全局的思考起来这个题目就很容易懂了。当然题解还给你贴心的画上股市折线图(这真的好吗,看图更让人脱离题目了好吧。

最后

股票问题还是蛮贴近生活的,毕竟金融是需要算法和数学的地方,羡慕学神大佬的数学和编程。股票问题好像是难度比较极端,还有两道难题 123188 我就没敢去看了,算法我确实不懂了,看来还是得多加练习,先把容易的学会。

@JunQu
Copy link
Owner Author

JunQu commented Jun 2, 2021

English Review

原文链接: https://hacks.mozilla.org/2021/06/looking-fine-with-firefox-89/

Firefox 89 看起来非常不错

在减少了活动的一年后我们(Firefox)在这里感觉到有一点点跟不上时代,但是Firefox 89 变得更好看了,同时它拥有了更轻量、更精简的界面。
在新界面的同时我们获得了一些非常棒的样式功能,包括像force-colors功能可以通过媒体查询的方式更好的控制字体的显示。期待已久的JavaScript模块关键字top-level await关键字现在已经启用。同样的还有PerformanceEventTiming接口,这是API的性能套件的另一个扩展:(表明Firefox)89真的在努力(提升)!
这篇博客只是提供需要关注的点,需要所有详细信息,请查看下面链接里面的内容:

frumpy adj. 过时的,无魅力的,邋遢的
slim adj. 苗条的,纤细的,瘦身,减肥
merely adv. 仅仅,只是,只不过 (强调不重要或者不严重的效果)
restrict verb. 限制,限定

@JunQu
Copy link
Owner Author

JunQu commented Jun 2, 2021

Tip

Plain Object

Plain Object 翻译过来应该叫纯粹对象、普通对象。准确来说 JavaScript 并没有这个概念,我很怀疑这个概念是从隔壁 java 的 POJO 联想而来的,所以这里并没有官方定义什么是纯粹的。
我查了一下,大概可以这么理解,通过{}Object.create(null) 创建的对象就是 Plain Object .

{x:1} // is plain object
{x: new Date()} // is  plain object
Object.create(null) // is  plain object

Object.create({x:1}) // not  plain object
[1,2,3] // not  plain object
new Date // not  plain object

看到这个比较相信对这个所谓 Plain Object 有了概念,它就是要一个纯粹的对象来操作,不需要你去其他地方继承对象,显然可以通过原型链去判断它是不是继承自其他对象。
由于没有类似JSON那种官方标准,只是民间的一些概念,所以对于它的判定就有不同的实现,例如 redux 源码里面的 isPlainObject

export default function isPlainObject(obj: any): boolean {
  if (typeof obj !== 'object' || obj === null) return false
  let proto = obj  
  while (Object.getPrototypeOf(proto) !== null) {   
    proto = Object.getPrototypeOf(proto) 
 }
  return Object.getPrototypeOf(obj) === proto}
}

在 redux 这里,它把 Object.create(null)给排除了,我只能说各家的标准不一样。同样的有 Jquery、lodash,对于某些差异仍然存在,当然对于{x:1}这样直接定义的对象判断都是true,具体差异表现可以参考这个回答:

https://www.zhihu.com/question/287632207/answer/458261384

总体来说,我也不是特别清楚这个概念的作用在哪,了解它主要是当时去了解 Lodash 源码和 redux 源码的时候,突然对这个概念很好奇,在某些特殊场景下比如需要提供一个全局对象上可能是有用的。而我期待的 Plain Object,更有点类似java里面的POJO,在JavaScript里面就是可以被JSON转换的对象,除了原型链上的方法,不应该丢掉属性的对象,这样纯粹的对象可以非常方便转换为其他的数据结构,当然这样的对象检查起来就非常需要性能支持了但是typescript就可以非常好的做这个检查。
又了解了一个无用的知识🐭

@JunQu
Copy link
Owner Author

JunQu commented Jun 2, 2021

Share

工具分享

  • 前端工具越来越好了,我更喜欢网页的应用,这是网页调用本地的node,只能说非常不错:https://stackblitz.com/
  • 最简单的方式启动 react 项目, 说实话这正是我一开始学习react的方式,现在发现竟然还能被大佬写了一篇文章,不过人家确实写的循序渐进、通俗易懂:https://kentcdodds.com/blog/super-simple-start-to-react
  • 正则表达式的工具,这个网站对正则的强大之处可以说无出其右,唯一的遗憾可能就是不不开源:https://regex101.com/

生活分享

  • 看了《爱死机2》前8集,怎么说呢,感觉为什么这些小众的东西会有这么多吹捧的,当然我是动画爱好者,迪士尼的动画和皮克斯的动画我几乎全部看过,皮克斯出了小短片也非常有意思,《爱死机2》当然和它的前作《爱死机》相比确实深度下降不少,但是小众的东西水平变化太正常了,皮克斯的短片都难说的上每年都是精品。
  • 《哆啦a梦 伴我同行2》同样有点让我失望,毕竟当时《哆啦A梦:伴我同行》虽然故事和结局有点牵强,但是动画效果着实把我惊到了。现在看《伴我同行2》故事有点奇怪,总体上给我很空洞的感觉,我只想说:就这?当然为了情怀依然可以看一下,就像还在突然一直卖情怀、炒冷饭的《超龙珠英雄》,就当作看个情怀的。
  • 推荐书籍《Refactoring: Improving the Design of Existing Code (2nd Edition) 》,《Refactoring2》是以 JavaScript 语言为示例写的书籍,所以对前端来说更为熟悉了,我再不用装 JDK 去学习这本书了,书非常经典。 下图来自我借老板的书籍(PS:翻译的竟然比原版便宜六倍,直接购买熊节大佬翻译的简直血赚钱好吧)。

image

@JunQu JunQu added the ARTS label Jun 2, 2021
@JunQu JunQu self-assigned this Jun 2, 2021
@JunQu JunQu added this to the 2021-06 milestone Jun 3, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant