第一题
这题直接模拟即可
class Solution {
public:
int minNumberOfHours(int initialEnergy, int initialExperience, vector<int>& energy, vector<int>& experience) {
int sum = 0;
for(auto& a : energy) sum +=a;
int aa = 0;
if(sum >= initialEnergy)aa += sum -initialEnergy+1;
for(auto& c: experience){
if(initialExperience <= c){
int tmp = c - initialExperience +1;
initialExperience +=tmp + c;
aa += tmp;
}
else initialExperience += c;
}
return aa;
}
};
第二题
先遍历数组,统计每个数字出现的次数形成cnt数组,再由大到小枚举每个数字,组成结果的前半段,组成后的数字需在cnt数组中除去,枚举完前半段后,再在剩余的cnt中找最大的数字作为中间的数,最后再将前半段的倒序放到后半段即可
class Solution {
public:
string largestPalindromic(string num) {
int cnt[10] = {0};
for (char c : num) cnt[c - '0']++;
string ans, ans2;
for (int i = 9; i >= 0; i--) {
if (i == 0 && ans.empty()) break;
int t = cnt[i] / 2;
for (int j = 0; j < t; j++) ans.push_back(i + '0');
cnt[i] -= t * 2;
}
ans2 = ans;
reverse(ans2.begin(), ans2.end());
for (int i = 9; i >= 0; i--) if (cnt[i]) {
// 此时 0 无需跳过,因为单独一个 0 是合法的答案
ans.push_back(i + '0');
break;
}
return ans + ans2;
}
};