其他分享
首页 > 其他分享> > 【蓝湖专场】力扣第 241 场周赛

【蓝湖专场】力扣第 241 场周赛

作者:互联网

昨天晚上睡晚了,4点睡的,10点爬起来晕乎乎的打比赛

文章目录

第一题:5759. 找出所有子集的异或总和再求和

题目链接

5759. 找出所有子集的异或总和再求和

题目简介

在这里插入图片描述

题目思路

题目代码

class Solution {
    public int subsetXORSum(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> path = new ArrayList<>();
        dfs(path, list, 0, nums);
        int sum = 0;
        for(int i = 0; i < list.size(); i++){
            int num = 0;
            List<Integer> list1 = list.get(i);
            if(list1.size() == 0){
                sum += num;
            }else{
                for(int j = 0; j < list1.size(); j++){
                    num = num ^ list1.get(j);
                }
            }
            sum = sum + num;
        }
        return sum;
    }
    
    
    public void dfs(List<Integer> path, List<List<Integer>> list, int index, int[] nums){
        list.add(new ArrayList<>(path));
        if(index == nums.length){
            return;
        }
        
        for(int i = index; i < nums.length; i++){
            path.add(nums[i]);
            dfs(path, list, i + 1, nums);
            path.remove(path.size() - 1);
        }
    }
}

第二题:5760. 构成交替字符串需要的最小交换次数

题目链接

5760. 构成交替字符串需要的最小交换次数

题目简介:

- 对于

题目思路

题目代码

/*
比赛代码,有点粗糙
*/
public int minSwaps(String s) {
        int size = s.length();
        int res0 = 0;
        int res1 = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '0') {
                res0++;
            } else {
                res1++;
            }
        }
        // 假设0的数量大于1的数量
        // 01010
        // 偶数为0,奇数为1
        if (res0 > res1) {
            int num1 = 0;
            int num2 = 0;
            for (int i = 0; i < s.length(); i++) {
                if (i % 2 == 0 && s.charAt(i) == '1') {
                    num1++;
                } else if (i % 2 == 1 && s.charAt(i) == '0') {
                    num2++;
                }
            }
            if (num1 == num2) {
                return num2;
            } else {
                return -1;
            }
        }
        // 假设1的数量大于0的数量
        // 1010101
        // 偶数为1,奇数为0
        if (res1 > res0) {
            int num1 = 0;
            int num2 = 0;
            for (int i = 0; i < s.length(); i++) {
                if (i % 2 == 0 && s.charAt(i) == '0') {
                    num1++;
                } else if (i % 2 == 1 && s.charAt(i) == '1') {
                    num2++;
                }
            }
            if (num1 == num2) {
                return num2;
            } else {
                return -1;
            }
        }

        // 两种都有可能
        if (res0 == res1) {
            int num1 = 0;
            int num2 = 0;
            for (int i = 0; i < s.length(); i++) {
                if (i % 2 == 0 && s.charAt(i) == '1') {
                    num1++;
                } else if (i % 2 == 1 && s.charAt(i) == '0') {
                    num2++;
                }
            }


            int num3 = 0;
            int num4 = 0;
            for (int i = 0; i < s.length(); i++) {
                if (i % 2 == 0 && s.charAt(i) == '0') {
                    num3++;
                } else if (i % 2 == 1 && s.charAt(i) == '1') {
                    num4++;
                }
            }

            if (num1 == num2 && num3 == num4) {
                return Math.min(num1, num3);
            } else if (num1 == num2) {
                return num1;
            } else if (num3 == num4) {
                return num3;
            } else {
                return -1;
            }
        }
        return -1;
    }

第三题:5761. 找出和为指定值的下标对

题目链接

5761. 找出和为指定值的下标对

题目简介

在这里插入图片描述

题目思路

题目代码

class FindSumPairs {
    ArrayList<Integer> list1;
    ArrayList<Integer> list2;
    HashMap<Integer, Integer> map;
    public FindSumPairs(int[] nums1, int[] nums2) {
        list1 = new ArrayList<>();
        list2 = new ArrayList<>();
        map = new HashMap();
        for(int i = 0; i < nums1.length; i++){
            list1.add(nums1[i]);
        }

       for(int i = 0; i < nums2.length; i++){
            list2.add(nums2[i]);
            if(map.containsKey(nums2[i])){
                int val = map.get(nums2[i]);
                val++;
                map.put(nums2[i], val);
            }else{
                map.put(nums2[i], 1);
            }
        }
    }
    
    public void add (int index, int val){
            int num= list2.get(index);
            int val2 = map.get(num);
            val2--;
            map.put(num, val2);
            int sum = num + val;
            list2.set(index, sum);
            if (map.containsKey(sum)) {
                int val1= map.get(sum);
                val1++;
                map.put(sum, val1);
            } else {
                map.put(sum, 1);
            }
    }
    
    public int count(int tot) {
        int sum = 0;
        for(int i = 0; i < list1.size(); i++){
            if(map.containsKey(tot - list1.get(i))){
                sum += map.get(tot -list1.get(i));
            }
        }
        return sum;
    }
}

/**
 * Your FindSumPairs object will be instantiated and called as such:
 * FindSumPairs obj = new FindSumPairs(nums1, nums2);
 * obj.add(index,val);
 * int param_2 = obj.count(tot);
 */

标签:map,蓝湖,题目,num1,num2,int,力扣,++,241
来源: https://blog.csdn.net/qq_40915439/article/details/116892839