20181110

Overview

Algorithm: 字符串相乘

题目

给定两个以字符串形式表示的非负整数num1num2,返回num1num2的乘积,它们的乘积也表示为字符串形式。

示例1:

输入:num1 = "2", num2 = "3"
输出:"6"

示例2:

输入:num1 = "123", num2 = "456"
输出:"56088"

说明:

  1. num1num2的长度小于 110。
  2. num1num2只包含数字0-9
  3. num1num2均不以零开头,除非是数字 0 本身。
  4. 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

思路

进位 1 2 3 4
5 6 1 7 0
6 7 4 0 4

测试用例及代码实现

Review: Why should you learn Go?

Go 语言从发布至今,已经走过了十个年头。对于编程语言来说,十年正是焕发青春的时期。并且到现在已经有越来越多的人和组织使用 Go 来编写自己的应用。这篇文章从软硬件的角度介绍了为什么你应该学习 Go,以及 Go 相对于其他语言的优势。以下是核心脉络:

过去几年间,硬件的发展已逐渐碰到了天花板。以作者为例,奔腾 3.0 GHz 4 核心处理在 2004 年就已经发布,但他的 MacBook Pro 2016 的处理器仍然是 2.9GHz。所以作者结合下图,得出了一个结论:摩尔定律正在失效!

那有没有可以提升处理器性能的方法呢?作者给出了三条方法:

但很遗憾,这些方法也有局限之处。缓存越大,获取数据就越慢,因此不能无限增大缓存。同样,增加更多的核心会导致更大的花销。

所以,我们不能依赖于硬件性能的提升,提升性能唯一的办法是寻求一个更高效的软件。但目前的编程语言都不够高效。因为它们都是按照 90 年代单线程的硬件环境去设计的。虽然它们也支持多线程,但随之而来的是锁、竞态、死锁等问题,而这会让一个问题变得无比复杂。

那 Go 有什么优势呢?goroutines!

Go 诞生于 2009 年,正是多核处理器大放异彩的几年,所以 Go 从设计之初就考虑到了对并发的处理。比如一个 goroutines 只消耗 2KB 的堆空间,而线程至少需要 1MB,因此你可以创建数以百万计的 goroutines。其他的优势比如:

这些所有的特性,使得 Go 处理并发如 Java 一样方便,但拥有 C/C++ 的执行速度,并且和 Erlang 一样漂亮、简洁、优雅!

另外,不同于 Java 等基于虚拟机的语言,Go 是直接运行在硬件上的。如果是 Java,虚拟机需要先将高级语言代码转换为字节码,然后才能执行:

而 C/C++ 等编译型语言则直接有高级语言代码翻译成二进制机器码:

但是,同样是编译型语言,Go 和 C/C++ 最大的区别是:C/C++ 竟然将变量的分配、释放这么痛苦的事情交给程序员来管理!而 Go 既有能和 C/C++ 媲美的执行速度,又有面向对象语言的垃圾回收机制,实在是太酷了!

因此,如果你还没有学习 Go 的计划,硬件的限制会促使你去写出更高效的代码,而 Go 就是最好的选择!

This article was posted on my blog and Github using the MIT Open Source License.