Leetcode177周赛

排名:800 / 2985(题目简单,但是晚到了半小时。。。)
第一题:日期之间隔几天
解题思路:日期问题,利用java的库函数和工具类可以方便的解决,但是leetcode不会默认导这些包,需要手动导一下。
代码:

import java.text.*;
import java.util.Date;
class Solution {
    public int daysBetweenDates(String date1, String date2) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		try {
			Date date3 = format.parse(date1);
            Date date4 = format.parse(date2);
            int a = (int) ((date3.getTime() - date4.getTime()) / (1000*3600*24));
		    return Math.abs(a);
		} catch (ParseException e) {
			e.printStackTrace();
		}
        return 0;
    }
}

第二题:验证二叉树
解题思路:一道明显的bfs题目,这里我是利用了一个set来存以及走过的节点,如果set中重复了,就说明出现回路了;还有一种情况,就是出现了两个毫不关联的两部分,这样也是不符合要求的。

class Solution {
    public boolean validateBinaryTreeNodes(int n, int[] leftChild, int[] rightChild) {
        Set set = new HashSet<>();
		int index= 0;
		List list = new ArrayList<>();
		Queue queue = new LinkedList<>();
		((LinkedList) queue).push(0);
		while(queue.size()!=0){
			index = ((LinkedList) queue).pop();
			if (leftChild[index]!=-1){
				if (set.contains(leftChild[index])){
					return false;
				}
				set.add(leftChild[index]);
				((LinkedList) queue).push(leftChild[index]);
			}
			if (rightChild[index]!=-1){
				if (set.contains(rightChild[index])){
					return false;
				}
				set.add(rightChild[index]);
				((LinkedList) queue).push(rightChild[index]);
			}
		}
        int flag =0;
		for (int i = 0; i < leftChild.length; i++) {
			if (leftChild[i]!=-1){
				flag++;
			}
			if (rightChild[i]!=-1){
				flag++;
			}
		}
		return flag==set.size();
    }
}

第三题:最接近的因数
解题思路:题目要求返回的是能够构成num+1或num+2中两个最接近的因数,我们可以开个根号,然后向左边进行遍历,向右遍历的话数字运算量会大大增加导致超时。
代码:

class Solution {
    public int[] closestDivisors(int num) {
        int[] n1 = helper(num + 1);
        int[] n2 = helper(num + 2);
        if (Math.abs(n1[0] - n1[1]) > Math.abs(n2[0] - n2[1]))
            return n2;
        return n1;
    }
    public int[] helper(int num) {
        int left = (int)Math.sqrt(num);
        while (left > 0) {
            if (num % left == 0)
                return new int[]{left, num / left};
            else
                left--;
        }
        return new int[]{};
    }
}

第四题:形成三的最大倍数
解题思路:将数组中的数字全部加起来,然后判断他对3取余,如果是余数0的话说明符合结果,排个序拼接返回;如果余数为1的话,说明如果能够构成3的倍数的话,需要减少一个对3取余为1的数,或者两个取余为2的数(如果同时出现的话,需要选减少一个对3取余为1的数);余数为2也是一样。
代码:

class Solution {
    public String largestMultipleOfThree(int[] digits) {
		int count = 0;
		int zeroCount = 0;
		Arrays.sort(digits);
		List list1 = new ArrayList<>();
		List list2 = new ArrayList<>();
		List list3 = new ArrayList<>();
		List all = new ArrayList<>();
		for (int i = 0; i < digits.length; i++) {
			count+=digits[i];
			if (digits[i]%3==1) list1.add(digits[i]);
			if (digits[i]%3==2) list2.add(digits[i]);
			if (digits[i]%3==0) list3.add(digits[i]);
			if (digits[i]==0) zeroCount++;
		}
		StringBuilder sb = new StringBuilder();
		if (count%3==0){
			for (int i = digits.length-1; i >= 0; i--) {
				sb.append(digits[i]);
			}
            if(zeroCount !=0 && sb.length()==zeroCount)return "0";
			return sb.toString();
		}else if (count%3==1){
			if (list1.size()>=1){
				list1.remove(0);
			}else if (list2.size()>=2){
				list2.remove(0);
				list2.remove(0);
			}else {
				return "";
			}
		}else {
			if (list2.size()>=1){
				list2.remove(0);
			}else if (list1.size()>=2){
				list1.remove(0);
				list1.remove(0);
			}else {
				return "";
			}
		}
		all.addAll(list1);
		all.addAll(list2);
		all.addAll(list3);
		Collections.sort(all);
		for (int i = all.size()-1; i >= 0; i--) {
			sb.append(all.get(i));
		}
		if(zeroCount !=0 && sb.length()==zeroCount)return "0";
		return sb.toString();
    }
}

你可能感兴趣的:(java,LeetCode,leetcode,算法,数据结构,哈希表,dfs)