模拟,找到最长前缀,再用每个长度减去最长前缀
class Solution {
public:
int findMinimumOperations(string s1, string s2, string s3) {
int a = s1.size() , b = s2.size() , c = s3.size();
int minl = min(a , min(b , c));
int maxl = max(a , max(b , c));
int l = 0 , ans = 0;
for(; l < minl ; l ++){
if(s1[l] == s2[l] && (s2[l] == s3[l])){
continue;
}else{
break;
}
}
if(l == 0)return -1;
ans += (a - l);
ans += (b - l);
ans += (c - l);
return ans;
}
};
贪心,找到最近的位置
class Solution {
public:
long long minimumSteps(string s) {
long long ans = 0;
int n = s.size();
int cnt = 0;
for(int i = 0 ; i < n ; i ++){
if(s[i] == '0')cnt ++;
}
vector<int>v;
for(int i = cnt; i < n ; i ++){
if(s[i] == '0')v.push_back(i);
}
int j = 0;
for(int i = 0 ; i < cnt ; i ++){
if(s[i] != '0'){
ans += (v[j++] - i);
}
}
return ans;
}
};
单独考虑每一个二进制位,依据数学原理,要让两数尽可能大的同时差尽可能的小
class Solution {
public:
int maximumXorProduct(long long a, long long b, int n) {
const int MOD = 1e9 + 7;
long long p = (a >> n) << n, q = (b >> n) << n;
for (int i = n - 1; i >= 0; i--) {
int x = a >> i & 1;
int y = b >> i & 1;
if (x == y) p |= 1LL << i, q |= 1LL << i;
else if (p < q) p |= 1LL << i;
else q |= 1LL << i;
}
p %= MOD;
q %= MOD;
return p * q % MOD;
}
};
后面再补…