【LeetCode每日一题】 1720. 解码异或后的数组
1720. 解码异或后的数组
取数组的最后一个元素进行异或即可。
class Solution {
public:
vector<int> decode(vector<int>& encoded, int first) {
vector<int> res {first};
for (auto x : encoded) {
res.push_back(res.back() ^ x);
}
return res;
}
};
554. 砖墙
求最少穿过的砖块数量,从对立面思考,当缝隙最多时,可达到最少,我们用哈希表来存储每个缝隙,计算缝隙出现的次数,最终取反即可。
class Solution {
public:
int leastBricks(vector<vector<int>>& wall) {
unordered_map<int, int> um;
for (auto w : wall) {
for (int sum = 0, i = 0; i + 1 < w.size(); i++ ) {
sum += w[i];
um[sum]++;
}
}
int res = 0;
for (auto [k, v] : um) {
res = max(res, v);
}
return wall.size() - res;
}
};
7. 整数反转
c++ 取模 -7 % 3 = -1 数学上 取模 -7 % 3 = 2,假设ans表示最终结果。那么ans = ans * 10 + x % 10ans * 10可能溢出, ans与INT_MIN、INT_MAX比较,以确定是否返回0.
class Solution {
public:
int reverse(int x) {
int ans = 0;
// c++ 取模 -7 % 3 = -1 数学上 取模 -7 % 3 = 2
// ans = ans * 10 + x % 10;
// ans * 10可能溢出 ans与INT_MIN、INT_MAX比较
// ans > (INT_MAX - x % 10) / 10
// ans < (INT_MIN - x % 10) / 10
while (x) {
if ((ans > 0 && ans > (INT_MAX - x % 10) / 10) || (ans < 0 && ans < (INT_MIN - x % 10) / 10)) return 0;
ans = ans * 10 + x % 10;
x = x / 10;
}
return ans;
}
};
740. 删除并获得点数
采用动态规划,模仿抢劫房子这道题。
class Solution {
public:
int deleteAndEarn(vector<int>& nums) {
// [3,4,2]
// dp[i] = max(dp[i-1], dp[i-2] + um[i] * i);
unordered_map<int, int> count;
int max_v = 0;
for (auto x : nums) {
count[x]++;
max_v = max(max_v, x);
}
vector<int> dp(max_v + 1);
dp[0] = 0;
dp[1] = count[1] * 1;
for (int i = 2; i <= max_v; i++) {
dp[i] = max(dp[i - 1], dp[i - 2] + count[i] * i);
}
return dp[max_v];
}
};