面试题 67:将字符串转化为整数
注意考虑正负数,非法字符,空字符串,溢出等问题。 |
public static int TurnStringToNum(char[] st){ if (st == null || st.length == 0){ error = true; return 0; } boolean isneg = false; if (st[0] == '+'){ return TurnStringToNum_core(st,1,isneg); }else if (st[0] == '-'){ isneg = true; return TurnStringToNum_core(st,1,isneg); }else { return TurnStringToNum_core(st,0,isneg); } } public static int TurnStringToNum_core(char[] st,int index,boolean ifneg){ int num = 0; for (int x = index;x<st.length;x++){ if (st[x] > '9' || st[x] < '0'){ error = true; return 0; } int flag = ifneg ? -1:1; num = num *10 + flag*(st[x]-'0'); if ((ifneg && num < 0x80000000)|| (!ifneg && num>0x7FFFFFFF)){ error = true; return 0; } } return num; }
面试题68:树中两个节点的最低公共祖先
二叉搜索树 | 判断当前节点与两个目标节点的大小关系,找到第一个在其之间的就是 |
带父指针的二叉树 | 转换为求两个链表的第一个公共节点问题 |
普通的二叉树 | 1.判断两个目标节点是否都在子树中,再在子树中判断,出现在子树中,但子树不满足的情况则找到第一个公共节 点 2.用两个链表保存从根到目标节点的路径,求最后一个公共节点。 |
public static boolean getPath(Node target, Node head, LinkedList it){ if (head == null || target == null){ return false; } it.add(head); if (head.value == target.value){ return true; } if (head.left!=null){ if (getPath(target,head.left,it) == true){ return true; } } if (head.right!= null){ if (getPath(target,head.right,it) == true){ return true; } } it.remove(it.size()-1); return false; } public static Node getLastCommon(LinkedList<Node> t1,LinkedList<Node> t2){ if (t1 == null || t2 == null){ return null; } int len1 = t1.size(); int len2 = t2.size(); int len = len1 > len2 ? len2:len1; int x = 0; for (;x<len;x++){ if (t1.get(x) != t2.get(x)){ break; } } return t1.get(x-1); } public static Node getFather(Node t1,Node t2,Node head){ if (t1 == null || t2 == null || head == null ){ return null; } LinkedList<Node> it1 = new LinkedList(); LinkedList<Node> it2 = new LinkedList(); getPath(t1,head,it1); getPath(t2,head,it2); return getLastCommon(it1,it2); }