LeetCode-67/104/1232/136

1.二进制求和(67)

题目描述:

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
LeetCode-67/104/1232/136_第1张图片
思路: 第一种方法就是直接将字符串转为二进制数,然后相加返回结果,但是提交未通过,这也是从官方题解那里学来的方法。第二种方法就是分别从两个字符串的尾部开始遍历,然后将对应的字符相加,如果等于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)
        );
    }


}

2.二叉树的最大深度(104)

题目描述:

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
LeetCode-67/104/1232/136_第2张图片
思路: 这题比较基础,就是用递归求出二叉树的最大深度,注意递归结束条件的设置,然后返回左右子树中的深度较大的一边即可。

代码:

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;
    }
}

3.缀点成线(1232)

题目描述:

给定一个数组 coordinates ,其中 coordinates[i] = [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。
LeetCode-67/104/1232/136_第3张图片
思路: 这里主要是判断斜率,我另外写了一个函数用于判断三个点是否在一条直线上,然后将每个点遍历一遍并放入该函数即可。另外写的函数主要就是要注意线与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);
        }
    

    }
}

4.只出现一次的数字(136)

题目描述:

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
LeetCode-67/104/1232/136_第4张图片
思路: 这题很简单,遍历数组然后将每一个元素进行异或,最终值就是只出现一次的数字,返回即可。

代码:

class Solution {
    public int singleNumber(int[] nums) {
        int ret=0;
        for(int i=0;i<nums.length;i++) {
            ret^=nums[i];
        }

        return ret;
    }
}

你可能感兴趣的:(leetcode,算法)