首页
ARTS 03 - 使用图解的方式来解决算法问题

ARTS左耳朵耗子提出来的一个打卡任务。每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西!我希望这个事可以给大家得到相应的算法、代码、技术和影响力的训练。

这是我的第三周打卡,标题为“使用图解的方式来解决算法问题”。这周在刷算法的时候,发现对于双指针、引用传递等问题用画图来理解的话,十分容易理解。

🤖 Algorithm

奇偶链表

📖 Review

Adding pipelines to JavaScript

ES2019的提案状态有两个新语法:可选链管道语法。这篇文章主要讲的是管道语法在JavaScript中的使用。

管道操作可以使某些类型的操作变得真正易于阅读,可以举个例子直观地感受到。

//传统方式
const capitalize = (input) => input[0].toUpperCase() + input.substring(1)
const removeSpaces = (input) => input.trim()
const repeat = (input, times) => input.repeat(times)

const withoutPipe = repeat(capitalize(removeSpaces('  i am gods  ')), 2)
console.log(withoutPipe)

//使用管道运算符
const withPipe = '  i am gods  '
  |> removeSpaces
  |> capitalize
  |> (str => repeat(str, 2))

console.log(withPipe)

上面的例子是对一个字符进行各种转换操作,可以看到使用管道语法后大大地减少嵌套括号的数量,阅读起来十分方便。之前在函数式编程语言 Elixir 中接触到管道操作符,在 TC39 提案中发现 JavaScript 也开始支持管道操作,觉得这个特性很棒。个人觉得,管道语法结合箭头函数可以在未来给 JavaScript 带来更多灵活地运用。

有一点需要注意的是,对多参数的使用发现没有像 Elixir 那样直接。如果有一个期望是两个参数的函数,则需要将其包装在一个箭头函数里。另一种方法可以使用函数柯里化来实现,如下:

const repeat = times => input => input.repeat(times)

const withPipe = '  i am gods  '
  |> removeSpaces
  |> capitalize
  |> repeat(2)

这种写法比上面就更加简洁一些了。

另外,在TC39 提案的建议里,有两种新的管道模式:smart pipelineF# pipeline

image_1ec2qc7c32pkf24102dfta1uin9.png-173kB

F# pipeline建议十分接近简单管道,唯一的区别是允许在管道操作中使用await来支持异步操作

url
|> fetch
|> await
|> (res => res.json())
|> doSomeJsonOperations

smart pipeline是借鉴Hack语言的。管道的输出被放到一个#的token中,以供管道右侧的表达式使用。

// With smart pipes

"   string" 
|> toUpper
|> # + " 😎"
|> prepend("😎 ", #)

// Without pipes
prepend(
  "😎 ",
  toUpper("  string") + " 😎"
)

这种方式增加了额外的语法糖,感觉理解起来没有前两种方式直接。

💡 Tip

ssh免密登录

在开发过程中,经常要连接到远程服务器。之前在windows下开发,使用 secureCRT 这样的软件来连接到远程主机,可以记住密码。后来换到mac环境,直接在终端中用ssh命令去连接,比较方便,但每次都需要手动输入密码。

于是配置了下ssh的免密登录。原理和操作都十分简单,主要是利用ssh-copy-id命令把ssh-key的公钥上传到远程服务器来进行认证。

1. 生成秘钥

cd ~/.ssh
ssh-keygen

2. 使用 ssh-copy-id 复制到远程主机

ssh-copy-id -i .ssh/id_rsa.pub  root@192.168.0.100

3. 免密登录

ssh root@192.168.0.100

💎 Share

分享文章:使用图解的方式来解决算法问题

这周在刷奇偶链表这个算法的时候,发现把链表画出来,通过图解的方式去写算法不到1分钟就可以写完,而且没有错误。官方的题解里也说到:解决链表问题最好的办法是在脑中或者纸上把链表画出来。有时通过这种方式比看代码要更容易理解。