每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章
题图:Photo by Luca Bravo
题目:345. Reverse Vowerls of a String
难度:Easy
题意:
Write a function that takes a string as input and reverse only the vowels of a string.
示例 1:
Input: "hello"
Output: "holle"
示例 2:
Input: "leetcode"
Output: "leotcede"
Note:
The vowels does not include the letter “y”.
解法:
这一题与之前的 344. Reverse String 不同,只要求交换字符串中的元音字符,即「a、e、i、o、u」(经测试还有大写的「A、E、I、O、U」)。那么思路其实比较简单就是交换首尾的两个元音字母的位置即可,那么我们想到用双指针法。思路如下:
首先需要建立一个查找的范围,即元音字符的范围;然后因为我们需要对字符串进行修改,所以先将其转换为列表类型;然后使用双指针法,遍历验证两个指针指向的字符是否存在于查找范围之中,如果存在,那么交换两者位置,否则继续遍历。
代码:
class Solution:
def reverseVowels(self, s: str) -> str:
vowels = 'aeiouAEIOU'
s = list(s)
i, j = 0, len(s) - 1
while i < j:
if s[i] not in vowels:
i += 1
elif s[j] not in vowels:
j -= 1
else:
s[i], s[j] = s[j], s[i]
i += 1
j -= 1
return ''.join(s)
时空复杂度 $O(n)$。
这周的文章来自 Medium,《6 Habits of Super Learners》。讲述了在二十一世纪保持领先——成为超级学习者的六个习惯,它们分别是:
这是 Medium 上一篇典型的鸡汤文,但又不那么古板,文章中还是有不少值得参考借鉴之处,推荐阅读。
译文请看次条。
在 R 中,当我们需要使用一个第三方标准库的时候,我们首先需要进行安装:
install.packages(PACKAGE_NAME)
这里我们可以同时安装多个第三方库,只要使用 c()
将不同的库的名称括起来即可。接下来我们需要加载这个第三方库:
library(PACKAGE_NAME)
这一步一次只支持加载一个第三方库。
为了简化这个流程,并且要能一次性加载多个库,我自己编写了一段代码:
Install_And_Load <- function(packages){
k <- packages[!(packages %in% installed.packages()[, "Package"])];
if (length(k)) {
install.packages(k, repos = 'https://cran.rstudio.com/');
}
for (lib_name in packages) {
library(lib_name, character.only = TRUE, quietly = TRUE)
}
}
使用这个函数有两种方式:
source('Install_And_load.R')
将其加载进来,然后调用。请类比 install.packages()
的格式进行调用:
Install_And_Load(c('PACKAGE1', 'PACKAGE2', ...))
在之前的一期打卡分享中,我分享了一个在线的 Markdown 排版工具「Markdown Nice」,说好了使用几周之后放上使用体验报告,这就来了。
Markdown Nice 不仅支持微信公众号,还支持知乎、开源中国、稀土掘金等多个平台,它本身也是一款开源服务,可以在 Github 上查看源代码。
从功能上看,Markdown Nice 拥有一整套从「Markdown 到公众号」的排版流程,提供了包括「微信外链转脚注」等非常实用的功能,能够高效率完成微信公众号排版。Markdown Nice 还支持多种样式,当然也支持自定义样式啦。
另外,Markdown Nice 近期发布了浏览器插件,可以支持在公众号中直接转换 Markdown 文档,再也不需要进行复制粘贴了。