100372. 使两个整数相等的位更改次数
从最大的位数开始枚举,如果发现当前数位大于目标值则进行相减直到相等
class Solution {
public:
int minChanges(int n, int k) {
int cnt = 0;
for (int i = 30, j = (1 << 30); i >= 0; i --, j /= 2) {
if ((n >> i & 1) && n - j >= k) {
n -= j, cnt ++;
}
}
if (n == k) return cnt;
else return -1;
}
};
100335. 字符串元音游戏
贪心,只有当字符串中没有元音的时候小红才会输
class Solution {
public:
bool doesAliceWin(string s) {
bool flag = false;
for (int i = 0; i < s.size(); i ++) {
if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u') {
flag = true;
break;
}
}
return flag;
}
};
100360. 将 1 移动到末尾的最大操作次数
首先利用贪心的思路,要想使操作次数最大,我们每次都从左侧开始移动,当碰到零的时候前面的所有1都会贡献1次操作代价,进行枚举即可。
class Solution {
public:
int maxOperations(string s) {
// 从左到右移动1,碰到零前面的1必须移动
int res = 0, cnt = 0;
for (int i = 0; i < s.size() ; i ++) {
if (s[i] == '1') cnt ++;
else if (s[i] == '0') {
if (i - 1 >= 0 && s[i - 1] == '1') res += cnt;
}
}
return res;
}
};
100329. 使数组等于目标数组所需的最少操作次数
将对整个数组的操作转换成了对两个位置上数的操作,即变为使两个差分数组相等。使用s累加免费的次数
class Solution {
public:
long long minimumOperations(vector<int>& nums, vector<int>& target) {
long long s = target[0] - nums[0];
long long ans = abs(s);
for (int i = 1; i < nums.size(); i ++) {
// 转化为计算差分数组中的差异
int k = (target[i] - target[i - 1]) - (nums[i] - nums[i - 1]);
// 有免费次数就用
if (k > 0) { // 需要正数
ans += s >= 0 ? k : max(k + s, 0ll);
} else { // 需要负数
ans -= s <= 0 ? k : min(k + s, 0ll);
}
s += k; // 免费次数,有就用没有就留着
}
return ans;
}
};