面试题67:把字符串转换成整数
题目:请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。
public int myAtoi(String str) {
if (str == null || (str = str.trim()).length() == 0) {
return 0;
}
int index = 0;
boolean negative = false;
if (str.charAt(0) == '-' || str.charAt(0) == '+') {
index++;
if (str.charAt(0) == '-') {
negative = true;
}
}
int result = 0;
for (int i = index; i < str.length(); i++) {
if (str.charAt(i) < '0' || str.charAt(i) > '9') {
return negative ? -result : result;
} else {
long temp = (long)result * 10;
result = result * 10 + (str.charAt(i) - '0');
if (result < temp) {
return negative ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
}
}
return negative ? -result : result;
} 面试题68:树中两个结点的最低公共祖先
题目一:二叉搜索树两个结点的最低公共祖先
- 算法:递归
- 当根节点的值处于两个节点值中间时即是最低公共祖先
- 当根节点的值大于两个节点值时最低公共祖先在左子树
- 当根节点的值小于两个节点值时最低公共祖先在右子树
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || p == null || q == null) {
return null;
}
if ((root.val >= p.val && root.val <= q.val) || (root.val <= p.val && root.val >= q.val)) {
return root;
} else if (root.val > p.val && root.val > q.val) {
return lowestCommonAncestor(root.left, p, q);
} else {
return lowestCommonAncestor(root.right, p, q);
}
} 题目二:普通二叉树两个结点的最低公共祖先
题目:输入两个树结点,求它们的最低公共祖先。
- 算法:
- 递归保存路径
- 最后一个公共节点
- 注意:
- 可能其中一个输入节点是这两个输入节点的公共祖先,需要让保存的路径包括输入节点本点
- null结点返回false
- 注意:
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || p == null || q == null) {
return null;
}
ArrayList<TreeNode> list1 = new ArrayList<TreeNode>();
getNodePath(root, p, list1);
ArrayList<TreeNode> list2 = new ArrayList<TreeNode>();
getNodePath(root, q, list2);
return getLastCommonNode(list1, list2);
}
public boolean getNodePath(TreeNode root, TreeNode p, ArrayList<TreeNode> list) {
if (root == null) {
return false;
}
if (root == p) {
list.add(root);
return true;
}
list.add(root);
boolean found = getNodePath(root.left, p, list) || getNodePath(root.right, p, list);
if (!found) {
list.remove(list.size()-1);
}
return found;
}
TreeNode getLastCommonNode(ArrayList<TreeNode> list1, ArrayList<TreeNode> list2) {
TreeNode temp = null;
for (int i = 0; i < list1.size() && i < list2.size(); i++) {
if (list1.get(i) == list2.get(i)) {
temp = list1.get(i);
}
}
return temp;
} 题目三:有指向父节点的指针的二叉树的最低公共祖先
- 算法:
- LeetCode Discuss
- 使用两个指针进行遍历,当一个指针到头时,就重置它为另一个链表的头节点
- 当两个链表长度相同时:不到一轮遍历既能找到答案
- 当两个链表长度不同时:不到二轮遍历既能找到答案
public TreeNode2 lowestCommonAncestor(TreeNode2 root, TreeNode2 p, TreeNode2 q) {
if (root == null || p == null || q == null) {
return null;
}
TreeNode2 a = p;
TreeNode2 b = q;
while (a != b) {
a = (a == null) ? q : a.parent;
b = (b == null) ? p : b.parent;
}
return a;
} 

京公网安备 11010502036488号