[LeetCode] 第161场周赛题解

本文探讨了四个算法问题,包括字符串字符分组、初中数学应用、字符串有效括号删除以及判断数组是否构成良好序列。通过具体代码示例,深入解析了解决方案的设计思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题:

根据每列的字符分组,xx和yy跳过,剩下xy和yx,其中两个相同的xy或yx都只需一次就可转换成相同的,最后两两配对,若这两组最后都只剩下一个没有完成配对,则这两个剩下的配对,需要交换两次,若一组完全配对,另一组剩一个,则无解。

public class Solution {
    public int minimumSwap(String s1, String s2) {
    	int cnt1=0;
    	int cnt2=0;
    	for(int i=0;i<s1.length();i++) {
    		if(s1.charAt(i)==s2.charAt(i))
    			continue;
    		if(s1.charAt(i)=='x'&&s2.charAt(i)=='y')
    			cnt1++;
    		else
    			cnt2++;
    	}
    	int ans=cnt1/2+cnt2/2;
    	cnt1%=2;
    	cnt2%=2;
    	if(cnt1!=cnt2)
    		return -1;
    	ans+=cnt1*2;
    	return ans;
    }
}

第二题:

初中数学,没啥好说的。

public class Solution {
	
    public int numberOfSubarrays(int[] nums, int k) {
        ArrayList<Integer> buf=new ArrayList<Integer>();
        int n=nums.length;
        
        for(int i=0;i<nums.length;i++) {
        	if(nums[i]%2==1) {
        		buf.add(i);
        	}
        }
        int ans=0;
        if(k<buf.size()) 
        	ans+=(buf.get(0)+1)*(buf.get(k)-buf.get(k-1));
        else
        	if(k-1<buf.size()) {
        		ans+=(buf.get(0)+1)*(n-buf.get(k-1));
        		return ans;
        	}
        for(int i=1;i+k<buf.size();i++) {
        	ans+=(buf.get(i)-buf.get(i-1))*(buf.get(i+k)-buf.get(i+k-1));
   
        }
        if(buf.size()>k)
        	ans+=(n-buf.get(buf.size()-1))*(buf.get(buf.size()-k)-buf.get(buf.size()-k-1));
        return ans;
    }
}

第三题:

直接对这个字符串扫一遍标记哪些位置需要删除即可。

public class Solution {
	public String minRemoveToMakeValid(String s) {
		Stack<Integer> stk=new Stack<Integer>();
		boolean[] jud=new boolean[s.length()];
		
		for(int i=0;i<s.length();i++) {
			if(s.charAt(i)!='('&&s.charAt(i)!=')')
				continue;
			if(s.charAt(i)=='(')
				stk.push(i);
			else {
				if(stk.size()==0) {
					jud[i]=true;
					continue;
				}
			    stk.pop();
			}
		}
		for(int v:stk)
			jud[v]=true;
		StringBuilder ans=new StringBuilder();
		for(int i=0;i<s.length();i++) {
			if(jud[i])
				continue;
			ans.append(s.charAt(i));
		}
		return ans.toString();
	}
}

第四题:

这题需要知道一个性质,任意两个互质的数一定能构成一个连续的无限序列,类似于n,n+1,n+2,n+3...,有兴趣的同学可以手玩一下,知道这个性质,那么这题就是个水题了,只需要看这整个序列是否存在两个互质的数即可,即整个序列的最大公因数是否等于1。

public class Solution {
	public int gcd(int a,int b) {
		while(b>0) {
			int c=a%b;
			a=b;
			b=c;
		}
		return a;
	}
	
	public boolean isGoodArray(int[] nums) {
		int ans=0;
		
		for(int v:nums)
			ans=gcd(ans,v);
		return ans==1;
	}
}

 

"sgmediation.zip" 是一个包含 UCLA(加利福尼亚大学洛杉矶分校)开发的 sgmediation 插件的压缩包。该插件专为统计分析软件 Stata 设计,用于进行中介效应分析。在社会科学、心理学、市营销等领域,中介效应分析是一种关键的统计方法,它帮助研究人员探究变量之间的因果关系,尤其是中间变量如何影响因变量与自变量之间的关系。Stata 是一款广泛使用的统计分析软件,具备众多命令和用户编写的程序来拓展其功能,sgmediation 插件便是其中之一。它能让用户在 Stata 中轻松开展中介效应分析,无需编写复杂代码。 下载并解压 "sgmediation.zip" 后,需将解压得到的 "sgmediation" 文件移至 Stata 的 ado 目录结构中。ado(ado 目录并非“adolescent data organization”缩写,而是 Stata 的自定义命令存放目录)目录是 Stata 存放自定义命令的地方,应将文件放置于 "ado\base\s" 子目录下。这样,Stata 启动时会自动加载该目录下的所有 ado 文件,使 "sgmediation" 命令在 Stata 命令行中可用。 使用 sgmediation 插件的步骤如下:1. 安装插件:将解压后的 "sgmediation" 文件放入 Stata 的 ado 目录。如果 Stata 安装路径是 C:\Program Files\Stata\ado\base,则需将文件复制到 C:\Program Files\Stata\ado\base\s。2. 启动 Stata:打开 Stata,确保软件已更新至最新版本,以便识别新添加的 ado 文件。3. 加载插件:启动 Stata 后,在命令行输入 ado update sgmediation,以确保插件已加载并更新至最新版本。4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值