[LeetCode] 第161场周赛题解

第一题:

根据每列的字符分组,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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值