461、汉明距离
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 231.
示例:
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。
解答
https://www.cnblogs.com/Amenity-arithmetic/p/8572338.html
public static int hammingDistance(int x, int y) {
int sum = x^y;
int count;
for(count = 0; sum > 0; count++){
sum &= (sum - 1);
}
return count;
}
104、二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回它的最大深度 3 。
解答
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int maxDepth(TreeNode root) {
if (root==null){
return 0;
}else if(root.left == null && root.right== null){
return 1;
}else{
int right=maxDepth(root.right);
int left=maxDepth(root.left);
int temp=(left>right?left:right);
return ++temp;
}
}
}
852、山脉数组的峰顶索引
我们把符合下列属性的数组 A 称作山脉:
A.length >= 3
存在 0 < i < A.length - 1 使得A[0] < A[1] < … A[i-1] < A[i] > A[i+1] > … > A[A.length - 1]
给定一个确定为山脉的数组,返回任何满足 A[0] < A[1] < … A[i-1] < A[i] > A[i+1] > … > A[A.length - 1] 的 i 的值。
示例 1:
输入:[0,1,0]
输出:1
示例 2:
输入:[0,2,1,0]
输出:1
解答
class Solution {
public int peakIndexInMountainArray(int[] A) {
int i=0;
int temp=0;
while(A[i]<A[i+1]){
i++;
temp=i;
}
return temp;
}
}
476、数字的补数
给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。
注意:
给定的整数保证在32位带符号整数的范围内。
你可以假定二进制数不包含前导零位。
示例 1:
输入: 5
输出: 2
解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。
示例 2:
输入: 1
输出: 0
解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。
解答
参考:https://blog.csdn.net/nsjlive/article/details/82530594
很直白的一个思路就是 把整型数字转换为二进制形式,再将二进制数取反,但是要考虑到32位的二进制数除了将int目标数转换为二进制的低位 的左边的高位数上的0,因为这些0不能取反 不能作为结果计算进去;
package myarray;
public class Solution476 {
/**
* 1、Integer.highestOneBit(num)取num的二进制数最左边的最高位,且高位后面全部补零,最后返回int型的结果。
* -1:因为经过上面的步骤,只有最高位为 1 其余位都为 0 这样再减一 就会导致借位 直到借到最高位
* 结果得到 最高位为0 其余位都为1 相当于取反了
* ~ :对一个数的二进制取反
* &:对两个二进制数进行按位与运算,例 101 101 * & 010 & 111 * 得 000 得 10
*
* @param args
*/
public static int findComplement(int num) {
return (~num) & (Integer.highestOneBit(num) - 1);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.print(findComplement(5));
}
}
617、合并二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
输入:
Tree 1 Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
输出:
合并后的树:
3
/
4 5
/ \ \
5 4 7
注意: 合并必须从两个树的根节点开始。
解答
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
if(t1 == null && t2 == null){
return null;
}else if(t1 == null ){
return t2;
}else if(t2 == null){
return t1;
}else{
t1.val+=t2.val;
t1.left=mergeTrees(t1.left, t2.left);
t1.right = mergeTrees(t1.right, t2.right);
}
return t1;
}
}