Archive / 历史文章

左耳听风 ARTS 打卡第十九周

发布于 2019/8/10 · 本文来自旧站归档,可能不代表当前观点。

01

正文

ARTS 第 19 周

每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章


Contents:

  • Algorithm: 121. Best Time to Buy and Sell Stock
  • Review: The Differences Between a Junior, Mid-Level, and Senior Developer
  • Tip: Pandas 中的 groupby 函数
  • Share: Vim 的文本对象

Algorithm

121. Best Time to Buy and Sell Stock

题目:121. Best Time to Buy and Sell Stock

难度:Easy

题意:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例 1:

Input: [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
             Not 7-1 = 6, as selling price needs to be larger than buying price.

示例 2:

Input: [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.

解法:

这道题的解法非常直接,只要遍历循环完所有的价格,然后将每一天的价格与之前存储的最低价格比较,选出这两者之间的较低价格作为最低价格,再计算当天价格与最低价格之差,将这个差与之前存储的最大利润相比较,选出两者之间的最大值,当遍历完成之后,最大利润也就找到了。

代码:

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        max_profit, min_price = 0, float('inf')

        for i in prices:
            min_price = i if i < min_price else min_price
            max_profit =  (i - min_price) if max_profit < (i - min_price) else max_profit

        return max_profit

时间复杂度 O(n),空间复杂度 O(1)。


Review

The Differences Between a Junior, Mid-Level, and Senior Developer

本周阅读了 Medium 上的一篇讲述初级、中级和高级开发者之间的区别的文章,The Differences Between a Junior, Mid-Level, and Senior Developer

本文就三者之间的区别以及如何进行跨越展开讨论:

  • 区别:

    • 知识
    • 编码技巧
    • 提问的技巧
    • 经验
  • 跨越:

    • 初级到中级:经历多次开发周期
    • 中级到高级:承担难题与掌握技术栈

Tips

Pandas 中的 groupby 函数

本周和大家分享 Pandas 中的一个常用且高效的函数,叫做 groupby()

顾名思义,「groupby」就是「按 XXX 进行分组」的意思。举个简单的例子,我们有如下所示的表,将其按照「A」进行分组,结果如右所示。

groupby 的功能大致来说有 split、apply 和 combine:

  • split:先将数据按一个属性分组 (得到 DataFrameGroupby / SeriesGroupby )
  • apply:对每一组数据进行操作 (求均值、中值、方差或应用自定义函数)
  • combine:将操作后的结果结合起来 (得到一个DataFrame 或 Series 或可视化图像)

细节功能请见文档 https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html


Share

Share: Vim 中的文本对象

Vim 中有一个与「面向对象编程」比较相似的一个概念,就是「文本对象」,其实「文本对象」并没有那么的神秘,大概有以下几种:

  • w,s,p 分别表示:word(单词),sentence(句子)和 paragraph(段落)
  • 单双引号与括号

配合几个常用的命令(command)就可以很快的对代码进行修改了:

  • v:visual 模式,选择一段文字
  • d:delete 删除,删除文本对象选择的文字
  • c:change 修改,删除选中的文字并进入插入模式
  • y:yank 复制,复制选中的文字

另外还需要记住在选择文本对象时,i 和 a 这两个命令的区别:

  • i:inner 内部,表示选择的对象仅限于文本对象内部,不包括文字后面的空格
  • a:around 周围,表示选择的对象环绕文本对象,包括文字后面的空格(但不包括前面的空格)

常用的使用方法如下:

[number]<command>[text object]
  • number 表示次数,比如几个单词、几句话或者几个段落
  • command 表示命令,常用的有 v、d、c 和 y
  • text object 就是配合 i/a 和 w/s/p/各种引括号 选择的文本对象了

示例:

  • viw:选择光标当前所在的单词
  • vaw:选择光标当前所在的单词以及其后面的空格
  • ci":删除双引号内部的文字并进入插入模式
  • ya{:复制光标所在的大括号内部的所有内容到剪贴板(包括大括号 {