给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
思路: 第一种方法就是直接将字符串转为二进制数,然后相加返回结果,但是提交未通过,这也是从官方题解那里学来的方法。第二种方法就是分别从两个字符串的尾部开始遍历,然后将对应的字符相加,如果等于2就将设置的进位变量置为1,这一步相当于进一位,最终等到短的字符串遍历完成,再将剩下的较长的字符串进行遍历,具体实现看代码。
代码:
class Solution {
public String addBinary(String a, String b) {
//addBinary1(a,b);
return addBinary2(a,b);
}
public String addBinary1(String a, String b) {
int lenA=a.length();
int lenB=b.length();
String strL=a;
String strS=b;
StringBuilder tmp=new StringBuilder();
if(lenA<=lenB) {
strL=b;
strS=a;
}
int carry=0;
int len1=strL.length();
int len2=strS.length();
while(len2>0) {
int plus=strL.charAt(len1-1)-'0'+strS.charAt(len2-1)-'0'+carry;
carry=plus/2;
tmp.insert(0,plus%2);
len1--;
len2--;
}
while(len1>0) {
int plus=strL.charAt(len1-1)-'0'+carry;
carry=plus/2;
tmp.insert(0,plus%2);
len1--;
}
if(carry!=0) {
tmp.insert(0,carry);
}
return tmp.toString();
}
public String addBinary2(String a, String b) {
return Integer.toBinaryString(
Integer.parseInt(a, 2) + Integer.parseInt(b, 2)
);
}
}
给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
思路: 这题比较基础,就是用递归求出二叉树的最大深度,注意递归结束条件的设置,然后返回左右子树中的深度较大的一边即可。
代码:
class Solution {
public int maxDepth(TreeNode root) {
if(root==null) {
return 0;
}
int left=maxDepth(root.left);
int right=maxDepth(root.right);
return left>=right? left+1:right+1;
}
}
给定一个数组 coordinates ,其中 coordinates[i] = [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。
思路: 这里主要是判断斜率,我另外写了一个函数用于判断三个点是否在一条直线上,然后将每个点遍历一遍并放入该函数即可。另外写的函数主要就是要注意线与x轴垂直的情况。
代码:
class Solution {
public boolean checkStraightLine(int[][] coordinates) {
for(int i=0;i<coordinates.length-2;i++) {
if(!checkThreePoints(coordinates[i][0],coordinates[i+1][0],coordinates[i+2][0],coordinates[i][1],coordinates[i+1][1],coordinates[i+2][1])) {
return false;
}
}
return true;
}
public boolean checkThreePoints(double x1,double x2,double x3,double y1,double y2,double y3) {
if((x1-x2==0)&&(x2-x3==0)) {
return true;
} else if((x2-x1==0 || x3-x2==0)) {
return false;
} else {
return (y2-y1)/(x2-x1)==(y3-y2)/(x3-x2);
}
}
}
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
思路: 这题很简单,遍历数组然后将每一个元素进行异或,最终值就是只出现一次的数字,返回即可。
代码:
class Solution {
public int singleNumber(int[] nums) {
int ret=0;
for(int i=0;i<nums.length;i++) {
ret^=nums[i];
}
return ret;
}
}