第一题
解题思路:
击败第i个对手后,自身精力和经验有相应变化
得到增加精力需要的时间和增加经验需要的时间,返回总时间
class Solution
{
public:
int minNumberOfHours
(int initialEnergy, int initialExperience, vector<int>& energy, vector<int>& experience)
{
int t1=0,t2=0;//t1表示增加精力需要的时间,t2表示增加经验需要的时间
int n=energy.size();
for(int i=0;i<n;i++)
{
t1=max(t1,energy[i]+1-initialEnergy);
t2=max(t2,experience[i]+1-initialExperience);
//自身精力和经验比对手精力和经验至少多1才能将对手击败
initialEnergy-=energy[i];
initialExperience+=experience[i];
//击败第i个对手后,自身精力和经验有相应变化
}
return t1+t2;
}
};
第二题
解题思路:
首先考虑左侧,然后考虑中间位,右侧就是左侧的翻转
合并左侧、中间位、右侧,返回答案
另外,需要考虑到回文数字只有一位数的情况
注意!回文数字的最高位不能是0,中间位只有一个数或者没有任何数
class Solution
{
public:
string largestPalindromic(string num)
{
string res;
int cnt[10]={0};//cnt数组用于存储字符串num中每个数字出现的次数
int n=num.size();
for(int i=0;i<n;i++)
cnt[num[i]-'0']++;
for(int i=9;i>=1;i--)//生成回文数字的左侧,此时应当确保最高位不能是0,所以i>=1
while(cnt[i]>=2)
{
res+=to_string(i);
cnt[i]-=2;//回文数字左右两侧需要对称,所以找到合适的数字就需要使用两次
}
if(res=="")//没有出现两次或以上次数的数字,只能返回一位数的回文数字
for(int i=9;i>=0;i--)
if(cnt[i])
{res+=to_string(i); return res;}
for(int i=9;i>=0;i--)//生成回文数字的左侧,此时最高位已经被确定为非零数字
while(cnt[i]>=2)
{
res+=to_string(i);
cnt[i]-=2;
}
string rever=res;
reverse(rever.begin(),rever.end());//生成回文数字的右侧
for(int i=9;i>=0;i--)//生成回文数字的中间位
if(cnt[i])
{res+=to_string(i); break;}
return res+rever;
//合并左侧、中间位、右侧,返回答案
}
};