我们常见的一些基本的数据结构比如整型int或者浮点型float由于位数过多无法用内置类型存储,这时候我们就需要自己实现高精度的数据类型来进行存储和运算。这种问题在实际产品中还是比较实用的,所以相对来说也是面试中的常客。LeetCode中关于高精度的题目有以下几道:
Add Binary
Add Two Numbers
Plus One
Multiply Strings
Add Binary 和 Add Two Numbers 是同一类型的题目,都是高精度中的加法运算,只是一个是二进制的,一个是十进制的,其实进制是无所谓的,代码基本可以统一起来用一种思路来实现。思路也很简单,就是从低位开始相加,一直维护进位就可以了。属于考察非常基本的数组操作,没有什么算法难度,主要看看coding实现能力。
Plus One 也是一道常见的题目,他其实就是实现C++中++的运算符,因为只需要+1,所以其实比上面的题目更加简单。这道题的小陷阱就是它是用数组从高位到低位进行存储的,所以如果出现进位,那么需要重新分配空间,并给最高位赋1,其他位赋0即可。这里恰好引入一个点,就是高精度存储应该低位到高位存储还是反过来好,这也是面试中可能问到的问题。
Multiply Strings 这道题是高精度的乘法运算,属于比较复杂的,需要对每一位的结果分别计算累加,其中的细节有点多,这里就不细说了,个人认为实现有点复杂,并不是很适合在面试中出现。
Add Binary
Add Two Numbers
Plus One
Multiply Strings
Add Binary 和 Add Two Numbers 是同一类型的题目,都是高精度中的加法运算,只是一个是二进制的,一个是十进制的,其实进制是无所谓的,代码基本可以统一起来用一种思路来实现。思路也很简单,就是从低位开始相加,一直维护进位就可以了。属于考察非常基本的数组操作,没有什么算法难度,主要看看coding实现能力。
Plus One 也是一道常见的题目,他其实就是实现C++中++的运算符,因为只需要+1,所以其实比上面的题目更加简单。这道题的小陷阱就是它是用数组从高位到低位进行存储的,所以如果出现进位,那么需要重新分配空间,并给最高位赋1,其他位赋0即可。这里恰好引入一个点,就是高精度存储应该低位到高位存储还是反过来好,这也是面试中可能问到的问题。
Multiply Strings 这道题是高精度的乘法运算,属于比较复杂的,需要对每一位的结果分别计算累加,其中的细节有点多,这里就不细说了,个人认为实现有点复杂,并不是很适合在面试中出现。
虽然说题目不多,但是这类题目的出现率却是非常高的,主要原因倒不是这种题目本身有很多的考点,而是它们特别好扩展,基本上来说问到这种题目,首先是考察一下coding能力,一般来说都是这种加减乘除的运算,接下来一定会是关于数据结构(或者说面向对象)的设计。这些题目的本身都是为高精度BigInteger服务的,面试官会问一些关于这个数据结构设计的问题,比如说如果让你来设计这个类,用什么数据结构来存(比如数组还是链表,各有什么利弊),需要哪些接口(构造函数,加减乘除运算等等),还有比如要设计构造函数,需要什么接口的构造函数(这里赋值构造函数,赋值运算符这些肯定是需要的,但是要注意必须提供对于常规类型比如int,long这些的接口,一个好的高精度类肯定是要对比它更弱的数据结构进行兼容的)。
上面我列举了一些可能在面试中会被继续考查的问题,也是一部分联想,像这种设计问题可以问得还是比较多的,也是非常常见的,大家可以自己多进行这种问题的准备和联想哈。