第一题
class Solution {
public:
string kthDistinct(vector<string>& arr, int k) {
map<string,int> mp;
int n=arr.size();
for(int i=0;i<n;i++)
{
mp[arr[i]]++; //存取每个字符串的出现次数
}
for(auto x:arr) //遍历arr数组
{
if(mp[x]==1)k--; //找到一个唯一的
if(k==0)return x;//找到第k个唯一
}
return "";//未找到
}
};
第二题
第三题
第一题:
模拟即可
class Solution {
public:
int percentageLetter(string s, char letter) {
unordered_map<char,int> mp;
for(auto x:s)
{
mp[x]++; //统计每个字符在字符串内的数量
}
return mp[letter]/(s.size()*1.0)*100;
}
};
第二题:
排序+贪心
class Solution {
public:
int maximumBags(vector<int>& capacity, vector<int>& rocks, int additionalRocks) {
int n=capacity.size();
vector<int> res;
for(int i=0;i<n;i++)
{
res.push_back(capacity[i]-rocks[i]); //每个背包还能装多少石头
}
int ans;
sort(res.begin(),res.end());
for(int i=0;i<n;i++)
{
additionalRocks-=res[i]; //装石头
if(additionalRocks<0) //可以装的石头没了
{
ans=i;
return ans;
}
}
return n;
}
};
第一题:简单模拟即可
class Solution {
public:
int findFinalValue(vector<int>& nums, int original) {
unordered_map<int,int> mp;
int n=nums.size();
for(int i=0;i<n;i++)
{
mp[nums[i]]++;
}
while(mp[original]) //有符合题意的值,则一直*2,直到找不到为止
{
original*=2;
}
return original;
}
};
第二题:预处理出来数组里0和1的数量
class Solution {
public:
vector<int> maxScoreIndices(vector<int>& nums) {
int n=nums.size();
int cnt1=0,cnt2=0;
vector<int> a(n+1,0),b(n+1);
int j=0;
for(int i=1;i<=n;i++)
{
if(nums[j++]==0)a[i]=++cnt1; //求数组里0的数量,是0则cnt1++
else a[i]=cnt1; //不是0,则继续cnt1
}
j=0;
for(int i=1;i<=n;i++)
{
if(nums[j++]==1)b[i]=++cnt2; //与上面求0的数量过程同理
else b[i]=cnt2;
}
vector<int> ans;
int maxv=1e-8,res;
for(int i=0;i<=n;i++)
{
res=a[i]+(b[n]-b[i]);
if(res>maxv)maxv=res; //求出最大得分值
}
for(int i=0;i<=n;i++)
{
if(a[i]+b[n]-b[i]==maxv) //是最大得分值的划分都要加入ans中
{
ans.push_back(i);
}
}
return ans;
}
};
第一题:简单模拟
class Solution {
public:
int minMaxGame(vector<int>& nums) {
while(true)
{
int n=nums.size();
vector<int> newnums(n/2);
if(n==1)break;
for(int i=0;i<n/2;i+=2)newnums[i]=min(nums[2*i],nums[2*i+1]);
for(int i=1;i<n/2;i+=2)newnums[i]=max(nums[2*i],nums[2*i+1]);
nums=newnums;
}
return nums[0];
}
};
第二题:排序+贪心
class Solution {
public:
int partitionArray(vector<int>& nums, int k) {
int n=nums.size();
sort(nums.begin(),nums.end());
int ans=0;
for(int i=0,j=0;i<n;i++)
{
if(nums[i]-nums[j]>k) // j为区间的左端点,i为区间的右端点,i向右试探
{
ans++;
j=i;
}
}
return ans+1;
}
};
等待后续........