第 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%3==1,说明一定有 一个num%3 ==1 || 两个 num%3==2 。如果sum%3==2,说明一定有一个num%3==2||两个num%3==1,把他们删掉,然后从大到小输出就可以了。

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

猜你喜欢

转载自www.cnblogs.com/xyqxyq/p/12350224.html
今日推荐