需要注意overflow,特别是Integer.MIN_VALUE这个数字。
需要掌握二分法。
不用除法的除法,分而治之的乘方
2. Add Two Numbers
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
基本等于合并数组,记得要最后加上carry位。
不需要考虑overflow,但是记得当输入两个空链表的时候输出0而不是空链表。
29. Divide Two Integers
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
不能使用除法的除法,让除数不停地乘以二直到会大于被除数为止。
核心代码如下:
while (x >= y) { int a = 0; while (x >= (y << a)) { a++; } a--; result += (long)1 << a; x -= y << a; }
其中,x是被除数,y是除数,这段代码里,还需注意x,y都是long。1要被强制转换为long
这道题有很多corner case,具体见
[leetcode] 29. divide two integers
43. Multiply Strings
Given two numbers represented as strings, return multiplication of the numbers as a string.
Note:
- The numbers can be arbitrarily large and are non-negative.
- Converting the input string to integer is NOT allowed.
- You should NOT use internal library such as BigInteger.
- 按照我目前的解法没有什么corner case需要考虑,只要把输出数字前面多余的0去掉就可以了。但是现在的解法比较慢。有空的时候再改进吧。
50. Pow(x, n)
Implement pow(x, n).
1. 0的0次方是1
2. 判断x是否为0,n是否为0,x是否是1
3. 判断x的正负性,判断n的正负性。
4. 注意n是Integer.MIN_VALUE的情况,这种情况下取绝对值的时候会overflow
BTW,Double.MIN_VALUE定义的是大于0的最小正数哦~
leetcode的testcase没有涉及到double overflow的情况,double overflow的时候直接返回MAX_VALUE了?