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