请你编写一个程序来计算两个日期之间隔了多少天。
日期以字符串形式给出,格式为 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);
}
}
二叉树上有 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= 0) {
cnt[leftChild[i]] += 1;
}
if(rightChild[i] >= 0) {
cnt[rightChild[i]] += 1;
}
}
if(cnt[0] != 0) {
return false;
}
for(int i=1; i
给你一个整数 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;
}
}
给你一个整数数组 digits,你可以通过按任意顺序连接其中某些数字来形成 3 的倍数,请你返回所能得到的 最大 的 3 的倍数。
由于答案可能不在整数数据类型范围内,请以字符串形式返回答案。
如果无法得到答案,请返回一个空字符串。
示例 1:
输入:digits = [8,1,9]
输出:"981"
分析:
能被3整除的数字,各个位上的数字之和也能被3整除。
观察数据规模只有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();
}
}