这双周赛改成贪心赛算了,fo了。
A拥有糖果最多的孩子
贪心+暴力。两重循环外层枚举每一个小朋友,内层去找当前的最大糖果数量。如果当前小朋友的糖加上额外给的能大于等于这个最大值就push一个1进去,否则push一个0。
class Solution {
public:
vector<bool> kidsWithCandies(vector<int>& candies, int extraCandies) {
vector<bool> ans;
int n = candies.size();
for(int i = 0; i < n; i++)
{
int maxn = 0;
for(int j = 0; j < n; j++)
if(i == j) continue;
else maxn = max(maxn, candies[j]);
if(candies[i] + extraCandies >= maxn)
ans.push_back(true);
else
ans.push_back(false);
}
return ans;
}
};
B改变一个整数能得到的最大差值
还是暴力。对每一个数位进行枚举。
三层循环外层枚举a中层枚举b内层枚举每一位。
设临时变量cur为当前数位上的值,如果cur==a就把它换成b。
设target为当前换出来得的数。如果有前导0就令target=0并结束循环。每次枚举数位结束后更新maxn与minn的值并判断操作是否合法,最终答案就是maxn-minn。
class Solution {
public:
int maxDiff(int num) {
int top = 0;
int dig[10];
int v = num;
while(v)
{
dig[++top] = v % 10;
v /= 10;
}
int maxn = num;
int minn = num;
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 10; j++)
{
int tar = 0;
for(int k = top; k >= 1; k--)
{
int cur = dig[k];
if(cur == i) cur = j;
if(k == top && cur == 0)
{
tar = 0;
break;
}
tar = tar * 10 + cur;
}
if(tar == 0) continue;
minn = min(minn, tar);
maxn = max(maxn, tar);
}
}
return maxn - minn;
}
};
C检查一个字符串是否可以打破另一个字符串
题目定义了:
字符串 x 可以"打破"字符串 y 当且仅当对于所有 i 都有x[i] >= y[i]。
其中x==y==n, 0<=i<=n-1, 字符大小按字典序顺序定义。
其实还是贪心。按照题目描述,一个能打破字符串x的字符串y,一定存在一个满足"y的第k大字符>= x的第k大字符"的排列。那按照这个条件,sort两个字符串然后按位比较就行了。
class Solution {
public:
bool checkIfCanBreak(string s1, string s2) {
int n = s1.size();
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
bool check1 = 1;
for(int i = 0; i < n; i++)
if(s1[i] < s2[i])
{
check1 = 0;
break;
}
bool check2 = 1;
for(int i = 0; i < n; i++)
if(s2[i] < s1[i])
{
check2 = 0;
break;
}
if(check1 || check2) return true;
else return false;
}
};