(有些题目存在更优解,但留到后期刷leetcode时处理)
题目名称
- 求1+2+3+……+n(剑指offer #64)
- 不用加减乘除作加法(剑指offer #65)
- 构建乘积数组(剑指offer #66)
- 把字符串转为整数(剑指offer #67)
- 树中两个节点的最低公共祖先(剑指offer #68)
- z型打印二叉树(剑指offer #69)
- 二叉树的层序遍历(剑指offer #70)
求1+2+3+……+n(剑指offer #64)
解题思路
不许用循环,那只能是用递归了,又不能使用if之类设立递归基,因此
解题方案
1 | class Solution { |
不用加减乘除作加法(剑指offer #65)
解题思路
位运算。这里的核心要点在于:
- a^b 相当于两个数不考虑进位相加
- (a&b)<<1 相当于两个数的进位
- 将二者相加
解题方案
1 | class Solution { |
构建乘积数组(剑指offer #66)
解题思路
将计算过程分为两步:
- 从左到右算 B[i]=A[0]*A[1]*…*A[i-1]
- 从右到左算B[i]*=A[i+1]*…*A[n-1]
为了保证O(n),可以采用一个变量保存连乘结果。
解题方案
1 | class Solution { |
实现atoi
解题思路
这种是纯粹的细节题,技术上难度不大。
解题方案
1 | int StringToInteger(string &str) { |
最低公共祖先
解题思路
若此时为二叉搜索树,那情况十分简单:判断当前root->val与两个节点的值。若两个节点的值都比root大,则祖先在右子树中,若都小,则在左子树之中。若一大一小,则当前即为祖先。
解题方案
1 | Node* FindLowestCommonAncestor(Node* root, Node* n1, Node* n2) |
z型打印二叉树(剑指offer #69)
解题思路
递归解决,当然迭代也是可行的
解题方案
1 | class Solution { |
二叉树的层序遍历(剑指offer #70
解题思路
其实和上一题是一样的。
解题方案
1 | class Solution { |