题目链接: Leetcode Weekly Contest 241
写在前面:
本次周赛惨遭零封。
1、1863. Sum of All Subset XOR Totals
难度:Easy
题目大意:
详见题意。
思路:
参考高赞回答,穷举数组所有的子序列,用位运算来提高速度。
代码
class Solution {
//参考https://leetcode.com/contest/weekly-contest-241/problems/sum-of-all-subset-xor-totals/
public int subsetXORSum(int[] nums) {
int n=nums.length;
int res=0;
for(int i=0;i<(1<<n);i++){
int xorSum=0;
for(int j=0;j<n;j++){
if((i&(1<<j))>0){
xorSum^=nums[j];
}
}
res+=xorSum;
}
return res;
}
}
2、1864. Minimum Number of Swaps to Make the Binary String Alternating
难度:Medium
题目大意:
详见题目。
思路:
参考高赞回答。最终的字符串要么是101010……要么是010101……所有原始字符串中0和1的个数相差不能超过1。
代码
class Solution {
public int minSwaps(String s) {
int n=s.length();
int zero=0,one=0;
for(char c:s.toCharArray()){
if(c=='0'){
zero++;
}
else{
one++;
}
}
if(Math.abs(one-zero)>1){
return -1;
}
if(zero-one==1){//说明字符串是以0开头的,010101...
return helper(s,'0');
}
else if(zero==one){
return Math.min(helper(s,'0'),helper(s,'1'));
}
else{
return helper(s,'1');
}
}
public int helper(String s,char c){
int diff=0;//字符不相同的个数
for(char c1:s.toCharArray()){
if(c1!=c){
diff++;
}
c=(c=='0'?'1':'0');
}
return diff/2;
}
}
3、1865. Finding Pairs With a Certain Sum
难度:Medium
题目大意:
详见题目。
思路:
参考高赞回答。
代码
class FindSumPairs {
int[] arr1;
int[] arr2;
Map<Integer,Integer> map=new HashMap<>();//统计nums2[]中各个元素的个数
public FindSumPairs(int[] nums1, int[] nums2) {
arr1=nums1;
arr2=new int[nums2.length];
for(int i=0;i<nums2.length;i++){
arr2[i]=nums2[i];
map.put(nums2[i],map.getOrDefault(nums2[i],0)+1);
}
}
public void add(int index, int val) {
map.put(arr2[index],map.get(arr2[index])-1);
arr2[index]+=val;
map.put(arr2[index],map.getOrDefault(arr2[index],0)+1);
}
public int count(int tot) {
int num=0;
for(int i=0;i<arr1.length;i++){//nums1[]中元素个数较少,所以遍历nums1,遍历nums2会超时
if(map.get(tot-arr1[i])!=null){
num=num+map.get(tot-arr1[i]);
}
}
return num;
}
}
/**
* 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);
*/
4、1866. Number of Ways to Rearrange Sticks With K Sticks Visible
难度:Hard
题目大意:
详见题目。
思路
参考高赞回答,思路非常巧妙,先考虑最后一个元素,根据最后一个元素是不是最大值分情况讨论,通过动态规划求解。
代码
class Solution {
int[][] dp=new int[1001][1001];
int mod=1000000007;
public int rearrangeSticks(int n, int k) {
if(n==k){
return 1;
}
if(k==0){
return 0;
}
if(dp[n][k]==0){
dp[n][k]=(int)((1L*rearrangeSticks(n-1,k-1)+1L*(n-1)*rearrangeSticks(n-1,k))%mod);
}
return dp[n][k];
}
}