【2022/03/27-第286场单周赛】复盘

总结
题目不难。
Q1.找出两数组的不同
两个哈希。
class Solution {
public:
vector<vector<int>> findDifference(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> ans(2);
int h1[2020] = {0}, h2[2020] = {0};
for(auto i : nums1) h1[i + 1000] = 1;
for(auto i : nums2) h2[i + 1000] = 1;
for(int i = 0; i < 2020; ++i){
if(h1[i] == 1 && h2[i] == 0) ans[0].push_back(i - 1000);
if(h1[i] == 0 && h2[i] == 1) ans[1].push_back(i - 1000);
}
return ans;
}
};
Q2.美化数组的最少删除数
遍历过去即可。
class Solution {
public:
int minDeletion(vector<int>& nums) {
int n = nums.size(), ret = 0;
for(int i = 0; i < n; i += 2){
int now = 0;
while(i + 1 + now < n && nums[i + 1 + now] == nums[i]) ++now;
i += now;
ret += now;
}
if((n - ret) % 2) ++ret;
return ret;
}
};
Q3.找到指定长度的回文数
找到基数10^((k+1)/2),然后加上(序数-1),然后逆序,拼接。
class Solution {
public:
long long rev(long long x){
long long ret = 0;
while(x){
ret = ret * 10 + x % 10;
x /= 10;
}
return ret;
}
vector<long long> kthPalindrome(vector<int>& q, int len) {
vector<long long> ret;
int w = len / 2 + (len % 2);
long long base = pow(10, w - 1);
for(long long i : q){
if(i > 9 * base) ret.push_back(-1);
else ret.push_back((base + i - 1) * pow(10, len / 2) + rev((base + i - 1) / pow(10, len % 2)));
}
return ret;
}
};
Q4.从栈中取出 K 个硬币的最大面值和
套路题。
class Solution {
public:
int maxValueOfCoins(vector<vector<int>>& piles, int k) {
int n = piles.size(), mx = 0;
vector<int> pre(k + 1, 0), now(k + 1, 0);
for(int i = 0; i < n; ++i){
int t = 0;
for(int j = 0; j <= piles[i].size(); ++j){
if(j > 0) t += piles[i][j - 1];
for(int l = j; l <= k; ++l){
now[l] = max(now[l], pre[l - j] + t);
}
}
pre = now;
}
return now[k];
}
};
浙公网安备 33010602011771号