算法题笔记
由于整数最大为2147483647,即超过这个数就会溢出
假设int x 恰巧为最大值,那么
y = x/10 ;y= 214748364; 所以y * 10 +pop > =Integer.MAX_VALUE ,所以pop>=7; 所以若 a = INTMAX/10 ,那么pop > 7 会溢出
还有如果a > y ,那么例如214748365 * 10 = 2147483650 > Integer.MAX_VALUE , 所以 a>INTMAX/10 会溢出
把123 ->321 -123 -> -321
private static int reverse(int x){
int rev = 0;
while (x != 0){
int pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE/10 && pop > 7)) return 0;
if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE/10 && pop < -8)) return 0;
// 用这种方法就能把一个数给反过来,例如123
rev = rev * 10 + pop;
}
return rev;
}
负数不行。最后一位是0 也不行,但是0 行
后半部分的反转与前半部分相等就行。
public boolean isPalindrome(int x) {
if(x < 0 || (x % 10 == 0 && x != 0)){
return false;
}
int revNum = 0;
while(x > revNum){
revNum = revNum * 10 + x % 10;
x /= 10;
}
return x == revNum || x == revNum/10; // 偶数个数与奇数个数
}
翻转一颗二叉树
示例:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int x) { val = x; }
}
/**
* 用递归的思想解决,因为根的左右子树交换,然后又将根的左子树作为根
* 进行同样的操作即可,所以还用此函数解决,即使用递归,有子树同理。
* @param root
* @return
*/
public TreeNode invertTree(TreeNode root){
if (root == null) return null;
// 交换根的左右子树
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
// 将根的左子树作为根进行同样的交换操作即可,所以还使用此函数,即为递归
if (root.left != null)
invertTree(root.left);
// 将根的右子树作为根进行它的左右子树交换操作
if (root.right != null)
invertTree(root.right);
// 所有递归调用的函数出栈后,返回了树的根节点
return root;
}
但是我们没有办法访问该节点的前一个节点,因为是单链表。
有一个办法就是将后面节点的值赋值为当前节点的值,这样两个节点的值一样。
然后再删除该节点的next 节点即可。 因为该题说明了要删除的节点不是末尾,所以可行。
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}