第 177 场周赛
日期之间隔几天
原来java写的时候还要加头文件,这题没有想太多,直接放弃c++,想用java的库函数,获取两天的毫秒数,相减,除以一天的毫秒数就得到了天数之差。
import java.text.ParseException;
import java.text.SimpleDateFormat;
class Solution {
public int daysBetweenDates(String date1, String date2) {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
java.util.Date sd = null;
try {
sd = sdf.parse(date1);
} catch (ParseException e) {
e.printStackTrace();
}
java.util.Date ed = null;
try {
ed = sdf.parse(date2);
} catch (ParseException e) {
e.printStackTrace();
}
long s=sd.getTime();
long e=ed.getTime();
if (s>e) {
long tmp=s;
s=e;
e=tmp;
}
int days=(int)((e-s)/(1000*3600*24));
return days;
}
}
5170. 验证二叉树
这题题中的节点是没有值得,题中都是用下标表示一个节点,这题数据目前有没有覆盖的样例。
但是我的解法可以过,bfs搜一下就可以了,然后查看经过bfs后是否还有任何点没有被标记,这样得话就是两棵以上的树了,这是非法的。
const int maxn=1e4+10;
int vis[maxn];
class Solution {
public:
bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
memset(vis,0,sizeof(vis));
if (bfs(0,leftChild,rightChild)==0) {
return false;
}
for (int i=0;i<n;i++) {
if (!vis[i]) {
return false;
}
}
return true;
}
int bfs(int s,vector<int>& leftChild,vector<int>& rightChild) {
vis[s]=1;
queue<int> q;
q.push(s);
while (!q.empty()) {
int root=q.front();
q.pop();
int left=leftChild[root];
if (left!=-1) {
if (vis[left]) {
return 0;
}
q.push(left);
vis[left]=1;
}
int right=rightChild[root];
if (right!=-1) {
if (vis[right]) {
return 0;
}
q.push(right);
vis[right]=1;
}
}
return 1;
}
};
5171. 最接近的因数
这题说实话就是这么写的,没啥好说的。
class Solution {
public:
vector<int> closestDivisors(int num) {
long long a=sqrt(num);
a++;
long long b=a;
while (a) {
while (a*b<=num+2) {
if (a*b==num+1||a*b==num+2) {
return {a,b};
}
b++;
}
a--;
}
return {a,b};
}
};
5172. 形成三的最大倍数
这题讲真不会写,后来看了下题解,存入每一个数的个数,sum%31,说明一定有 一个num%3 1 || 两个 num%32 。如果sum%32,说明一定有一个num%32||两个num%31,把他们删掉,然后从大到小输出就可以了。
class Solution {
public:
int cnt[10];
int del(int m) {
for (int i=m;i<10;i+=3) {
if (cnt[i]) {
cnt[i]--;
return 1;
}
}
return 0;
}
string largestMultipleOfThree(vector<int>& digits) {
int sum=0;
for (auto x:digits) {
cnt[x]++;
sum+=x;
}
if (cnt[0]==digits.size()) {
return "0";
}
if (sum%3==1) {
if (!del(1)) {
del(2);
del(2);
}
}
if (sum%3==2) {
if (!del(2)) {
del(1);
del(1);
}
}
int flag=0;
for (int i=9;i>0;i--) {
if (cnt[i]) {
flag=1;
break;
}
}
string ans;
if (flag) {
for (int i=9;i>=0;i--) {
while (cnt[i]--) {
ans+=i+'0';
}
}
return ans;
}
else {
if (cnt[0]) {
return "0";
}
else {
return "";
}
}
}
};