942增减字符串匹配
解题思路
因为数组里容易进行对换位置,所以先用数组。
通过不断的循环来检测是否满足给出的字符指示,一旦循环过后flag ==0,那就说明此次排序的结果已经满足了所给字符串的要求。
放入vector中返回即可.
代码
class Solution {
public:
vector<int> diStringMatch(string s) {
int n = s.size();
int a[n+1];
for(int i = 0;i<=n;i++){
a[i] = i;
}
while(true){
int flag = 0;
for(int i = 0;i < n;i++){
if(s[i] == 'I'){
if(a[i] > a[i+1]){
int tmp = a[i+1];
a[i+1] = a[i];
a[i] = tmp;
flag++;
}
}else{
if(a[i] < a[i+1]){
int tmp = a[i+1];
a[i+1] = a[i];
a[i] = tmp;
flag++;
}
}
}
if(flag==0)break;
}
vector<int> res;
for(int i = 0;i<n+1;i++){
res.push_back(a[i]);
}
return res;
}
};
1323 6和9组成的最大数字
解题思路
只要将数字改成string型的字符串就会好操作很多。
代码
class Solution {
public:
int maximum69Number (int num) {
string n = to_string(num);
for(int i = 0;i<n.size();i++){
if(n[i] == '6'){
n[i] = '9';break;
}
}
int ans = stol(n);
return ans;
}
};
561 数组拆分I
解题思路
如果要想让最后的和最大,就要尽可能的让大一些的数都成为min()的结果,可是最大的数终究不会出来,最小的数一定会出来,那就让尽可能大的数和更大的一组,尽可能小的数和稍微比它大的一组,这样就可以避免过大数和过小数在一祖,而产生浪费。
那就进行 排序就好了。然后每个奇数项都会出来,加和即可。
代码
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
sort(nums.begin(),nums.end());
int max = 0;
for(int i = 0;i<nums.size();i+=2){
max += nums[i];
}
return max;
}
};
2078 两栋颜色不同且距离最远的房子
解题思路
如果想要两个不同颜色的距离尽可能的长,当然还是要尽可能和边上的颜色去比。
如果第k和第k+x号不同,那么按照咱们的遍历顺序,即i和n-1,i+1和n-1,,,
直到第k号和n-1比较仍然相同才会要讨论k和k+x号的颜色不同,否则当0->k-1颜色相同,k和n-1颜色不同时,由于n-1在末尾则此时长度一定最长.但如果k和k+x不同,且k+X小于n-1.按照遍历顺序,当i等于k时,那么从0到k都和n-1一个颜色.如果出现k和k+x颜色不同,那么0和k+x颜色也不同,即从j那边遍历,当j = k+x时,会和0不同即最长 长度也可以遍历出来。
只能说:大佬牛逼!!
代码
class Solution {
public:
int maxDistance(vector<int>& colors) {
int n = colors.size();
int i, j;
for(i = 0, j = n-1; i < j; ++i, --j) //由于一定存在不同的颜色,所以当i==j时候一定就是不同的颜色
if(colors[i] != colors[n-1] || colors[j] != colors[0]) break;
return j;
}
};