231、2 的幂
法一:2^x==n 如果n是2的幂次方 那么n一直除2最终就会整除变成1 (4/2/2=1) 就满足题目条件
其中要注意:n如果是奇数的话,除2也有可能变成1(7/2/2=1),所以要排除奇数的可能性,且要防止偶数除2变成奇数的可能。(6/2=3)
class Solution {
public boolean isPowerOfTwo(int n) {
if(n==1) return true;
if(n<=0) return false;
while(n>1){
if (n%2 == 1) return false;//排除奇数
n = n/2;
}
return true;
}
}
法二:位运算
2的幂次方:n在二进制下,只有1位是1,其余全是0。而n-1&n就会全变成0
4:100
3:011
进行按位与后全变成0
class Solution {
public boolean isPowerOfTwo(int n) {
if(n==1) return true;
if(n<=0) return false;
return (n&(n-1))==0;
}
}
法三:for循环
计算机中32位int类型变量的范围,其中int类型是带符号整数。
即2^32是int的最大范围了
class Solution {
public boolean isPowerOfTwo(int n) {
for(int i=0;i<32;i++){
if(n==Math.pow(2,i)){
return true;
}
}
return false;
}
}
236、二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
为什么说两个结点在左子树只要找到最先遍历的结点就可以:
1、如果q是p的子孙,那么肯定先找到的是p,那么p就是p和q的公共祖先
2、如果q不是p的子孙,那么在到达p之前,肯定会先到达p和q的公共祖先r,然后分别到达p和q,也就可以返回r了
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
/*
为什么说找到一个就可以,因为:
1、如果q是p的子孙,那么肯定先找到的是p,那么p就是p和q的公共祖先
2、如果q不是p的子孙,那么在到达p之前,肯定会先到达p和q的公共祖先r,然后分别到达p和q,也就可以返回r了
*/
if(root==null) return root;//终止条件1
if(root.val==p.val||root.val==q.val) return root;//终止条件2
TreeNode left=lowestCommonAncestor(root.left,p,q);
TreeNode right=lowestCommonAncestor(root.right,p,q);
if(left!=null&&right!=null) return root;
return left==null?right:left;
}
}
263、丑数
class Solution {
public boolean isUgly(int n) {
if(n<=0) return false;
if(n==1) return true;
while(n%2==0){
n=n/2;
}
while(n%3==0){
n=n/3;
}
while(n%5==0){
n=n/5;
}
return n==1;
}
}