LeetCode第177场周赛

1360. 日期之间隔几天

请你编写一个程序来计算两个日期之间隔了多少天。

日期以字符串形式给出,格式为 YYYY-MM-DD,如示例所示。

示例 1:

输入:date1 = "2019-06-29", date2 = "2019-06-30"
输出:1

        这道题偷个懒,利用Java的库函数直接解。。。 

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

class Solution {
    public int daysBetweenDates(String date1, String date2) {
        LocalDate startDate = LocalDate.parse(date1);
        LocalDate endDate = LocalDate.parse(date2);
        long daysDiff = ChronoUnit.DAYS.between(startDate, endDate);
        return Math.abs((int)daysDiff);
    }
}

1361. 验证二叉树

二叉树上有 n 个节点,按从 0 到 n - 1 编号,其中节点 i 的两个子节点分别是 leftChild[i] 和 rightChild[i]。

只有 所有 节点能够形成且 只 形成 一颗 有效的二叉树时,返回 true;否则返回 false。

如果节点 i 没有左子节点,那么 leftChild[i] 就等于 -1。右子节点也符合该规则。

注意:节点没有值,本问题中仅仅使用节点编号。

示例 1:

输入:n = 4, leftChild = [1,-1,3,-1], rightChild = [2,-1,-1,-1]
输出:true

注意:

二叉树的充分条件:

1)根节点不能被访问到

2)其他节点都被访问到且只被访问一次

class Solution {
    public boolean validateBinaryTreeNodes(int n, int[] leftChild, int[] rightChild) {
        int[] cnt = new int[n];
        for(int i=0; i<n; i++) {
            if(leftChild[i] >= 0) {
                cnt[leftChild[i]] += 1;
            }
            if(rightChild[i] >= 0) {
                cnt[rightChild[i]] += 1;
            }
        }
        if(cnt[0] != 0) {
            return false;
        }
        for(int i=1; i<n; i++) {
            if(cnt[i] != 1) {
                return false;
            }
        }
        return true;
    }
}

1362. 最接近的因数

给你一个整数 num,请你找出同时满足下面全部要求的两个整数:

两数乘积等于  num + 1 或 num + 2
以绝对差进行度量,两数大小最接近
你可以按任意顺序返回这两个整数。

示例 1:

输入:num = 8
输出:[3,3]
解释:对于 num + 1 = 9,最接近的两个因数是 3 & 3;对于 num + 2 = 10, 最接近的两个因数是 2 & 5,因此返回 3 & 3 。

        技巧:从sqrt遍历到1,差肯定是逐渐变大的,所以遇到的第一个差肯定是最小。

class Solution {
    public int[] closestDivisors(int num) {
        int[] r = new int[2];
        int sqrt = (int) Math.sqrt(num + 2);  //平方根
        for(int i = sqrt; i >= 1; i--){
            if((num + 1) % i == 0){
                r[0] = i;
                r[1] = (num + 1) / i;
                return r;
            }
            if((num + 2) % i == 0){
                r[0] = i;
                r[1] = (num + 2) / i;
                return r;
            }
        }
        return r;
    }
}

1363. 形成三的最大倍数

给你一个整数数组 digits,你可以通过按任意顺序连接其中某些数字来形成 3 的倍数,请你返回所能得到的 最大 的 3 的倍数。

由于答案可能不在整数数据类型范围内,请以字符串形式返回答案。

如果无法得到答案,请返回一个空字符串。

示例 1:

输入:digits = [8,1,9]
输出:"981"

分析:

能被3整除的数字,各个位上的数字之和也能被3整除。

  • 计算digit数组之和sum。
  • 将数字分为3i、3i+1、3i+2。
  • 若sum % 3 == 1,删除一个3i+1即可,若没有这种数字,删除两个3i+2即可(可证此时3i+2至少存在两个);若sum % 3 == 2同理。

观察数据规模只有0到9,可统计每个数字出现的次数。

class Solution {
    private int[] num;

    private boolean delete(int k) {
        for (int i = k; i < 10; i = i + 3) {
            if (num[i] > 0) {
                num[i]--;
                return true;
            }
        }
        return false;
    }
    private String makeString() {
        StringBuilder ans = new StringBuilder("");
        for (int i = 9; i >= 0; i--)
            while (num[i]-- > 0)
                ans.append((char)(i + '0'));
        int index = 0;
        while (index < ans.length() - 1) {
            if (ans.charAt(index) != '0') break;
            index++;
        }
        return ans.delete(0, index).toString();
    }
    public String largestMultipleOfThree(int[] digits) {
        num = new int[10];
        int sum = 0;
        for (int value : digits) {
            num[value]++;
            sum += value;
        }
        int k = sum % 3;
        if (k > 0) {
            if (!delete(k)) {
                delete(3 - k);
                delete(3 - k);
            }
        }
        return makeString();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34519487/article/details/104742252
今日推荐