LeetCode 第171周赛

周赛排名(457 / 1707):(

第一题:1317. 将整数转换为两个无零整数的和
解题思路:题目给出了一个n,需要你返回两个数,且返回的两个值中不存在0(比如:101,110就是不合法的,前导0不算)。这里直接暴力的去枚举第一个值a,那么第二个值就是n-a,然后我是直接把数字转成String,去找0。若不存在,返回。
代码:

class Solution {
    public int[] getNoZeroIntegers(int n) {
        int[] ans = new int[2];
        for (int i = 1; i < n; i++) {
            int t = n-i;
            String s = String.valueOf(t);
            String s1 = String.valueOf(i);
            if (s.indexOf("0")==-1 && s1.indexOf("0")==-1 ){
                ans[0]=i;
                ans[1]=t;
                return ans;
            }
        }
        return ans;
    }
}

第二题:1318. 或运算的最小翻转次数
解题思路:题意很明显考的就是位运算,可以使用每一次右移一位,然后&1来判定当前位为0或1(周赛过程中偷懒,直接用了java中的函数,直接转成二进制做了。。。),之后的判断就简单了。
代码:

class Solution {
    public int minFlips(int a, int b, int c) {
        String s = Integer.toBinaryString(a);
        StringBuilder sb1 = new StringBuilder(s);
        String s1 = Integer.toBinaryString(b);
        StringBuilder sb2 = new StringBuilder(s1);
        String s2 = Integer.toBinaryString(c);
        StringBuilder sb3 = new StringBuilder(s2);
        int n = s.length();
        n=Math.max(s1.length(),n);
        n=Math.max(s2.length(),n);
        if (s.length()!=n){
            for (int i = 0; i < n - s.length(); i++) {
                sb1.insert(0,'0');
            }
        }
        if (s1.length()!=n){
            for (int i = 0; i < n - s1.length(); i++) {
                sb2.insert(0,'0');
            }
        }
        if (s2.length()!=n){
            for (int i = 0; i < n - s2.length(); i++) {
                sb3.insert(0,'0');
            }
        }
        int ans=0;
        for (int i = 0; i < n; i++) {
            if (sb3.charAt(i)=='1'){
                if (sb1.charAt(i)!='1' && sb2.charAt(i)!='1')
                    ans++;
            }
            if (sb3.charAt(i)=='0'){
                if (sb1.charAt(i)=='1') ans++;
                if (sb2.charAt(i)=='1') ans++;
            }
        }
        return ans;
    }
}

第三题:1319. 连通网络的操作次数
解题思路:使用union-find查出并集个数,之后返回并集个数-1即可,(ps:周赛过程中,想用set来强行自己找并集,之后超时了(先是10000的用例超时了,剪枝了之后4.9w的用例又挂了:(),没有使用过union-find的悲哀。。。)
代码:

class Solution {
    int[] pre;
    int count;
    public int makeConnected(int n, int[][] connections) {
        pre = new int[n];
        count = n;
        int line = connections.length;
        if (n-1>line) return -1;
        for (int i = 0; i < n; i++) {
            pre[i] = i;
        }
        for (int [] a:connections) {
            union(a[0],a[1]);
        }
        return count-1;
    }
    public int find(int n){
        int r = n;
        while (r!=pre[r]){
            r=pre[r];
        }
        return r;
    }
    void union(int n1,int n2){
        int r1 = find(n1);
        int r2 = find(n2);
        if (r1!=r2){
            count--;
            pre[r1]=r2;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值