总结

因为早上要开会,所以并没有参加该场周赛,有点可惜,下面就来做一下。

前三题还是比较简单的,但是前两题做的时候都先错了一遍非常的可惜,说明自己代码能力还是不够的熟练需要继续锻炼。

第四题差分数组题目,之前没有见过,但是感觉是一个模板可以记忆一下。

Q1:100372. 使两个整数相等的位更改次数

题目传送门:100372. 使两个整数相等的位更改次数 - 力扣(LeetCode)

锻炼一下二进制能力,签到题目。

最后实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int minChanges(int n, int k) {
int ans = 0;
while(n||k){
int a = n&1, b = k&1;
if (a^b){
if (a==0) return -1;
ans++;
}
n = n>>1; k = k>>1;
}
return ans;
}
};

Q2:100335. 字符串元音游戏

题目传送门:100335. 字符串元音游戏 - 力扣(LeetCode)

脑筋急转弯,做的时候还错了一次😂,

最后实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
bool doesAliceWin(string s) {
int ans = 0;
for(char c : s){
if (c=='a'||c=='e'||c=='i'||c=='o'||c=='u') ans++;
}
if (ans==0) return false;
if (ans==1) return true;
if (ans==2) return true;
return true;
}
};

Q3:100360. 将 1 移动到末尾的最大操作次数

题目传送门:100360. 将 1 移动到末尾的最大操作次数 - 力扣(LeetCode)

模拟题,从头开始遍历,记录1的个数,碰到0时,就要把前面所有的1往后移动直到碰到下一个1或者末尾。

最后实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
int maxOperations(string s) {
int cnt=0, ans=0;
bool flag = true;
for (char c : s) {
if(c=='1') flag=true, cnt++;
if(c=='0'&&flag) flag=false, ans += cnt;
}
return ans;
}
};

Q4:100329. 使数组等于目标数组所需的最少操作次数

题目传送门:100329. 使数组等于目标数组所需的最少操作次数 - 力扣(LeetCode)

这个题做出来运气成分比较大,观察题目发现是对子数组(具有连续性)进行操作,就将差分数组就直接拿来用了。

核心思想:通过差分数组,把对子数组的操作,转换成两个位置的变化,计算target[i]-nums[i]的差分数组,分析这个差分数组需要的操作次数

整体步骤分为如下3步:

  1. 计算target[i]-nums[i]得到一个数组a,相当于我需要一个全为0的数组,操作成数组a
  2. 求a的差分数组,原来的每次子数组操作(一堆)转化成每次两个位置的操作
  3. 从左到右遍历差分数组,统计操作次数(统计相同符号的和即可)

为什么只统计相同符号的和即可?

由于每次操作会产生一个 +1 和一个 −1,所以操作次数就等于所有正数 d[i] 之和

最后实现的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
long long minimumOperations(vector<int>& nums, vector<int>& target) {
int n = nums.size();
vector<int> op_nums(n), op_diff(n+1,0);
for (int i=0; i<n; ++i) { op_nums[i] = target[i] - nums[i]; }op_diff[0] = op_nums[0];
for(int i=1;i<n;++i) op_diff[i] = op_nums[i] - op_nums[i-1];
op_diff[n] = 0 - op_nums[n-1];
long long ans = 0;
for(int i=0;i<=n;++i){
if (op_diff[i]>0) ans += op_diff[i];
}
return ans;
}
};

本站由 @anonymity 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。