题目列表
2937. 使三个字符串相等
2938. 区分黑球与白球
2939. 最大异或乘积
2940. 找到 Alice 和 Bob 可以相遇的建筑
一、使三个字符串相等
这题把题目意思读懂,正常模拟就行,简单来说就是看三个字符串的最长公共前缀有多长,
代码如下
class Solution {
public:
int findMinimumOperations(string s1, string s2, string s3) {
int n1=s1.size(),n2=s2.size(),n3=s3.size();
int mn=min(n1,min(n2,n3));
int i;
for(i=0;i<mn;i++){
if(s1[i]!=s2[i]||s1[i]!=s3[i]||s2[i]!=s3[i])
break;
}
if(i==0) return -1;
else return n1+n2+n3-3*i;
}
};
二、区分黑球和白球
这题其实可以根据所给的示例,手玩一下,你就会发现最短的步数就是将黑球按照顺序从左往右依次排好需要的步数,
可能有人不太理解,我简单解释一下:假设有两个黑球分别在下标x、y (x<y)【下面用下标代替黑球】,按照我们的思路,把x放到0,y放到1,共有x-0+y-1步,如果我们把y放到0,x放到1,则会有y-0+(x+1-1) 【因为x在y前面,要想将y放到0,则x会被迫往后移动一位,所以需要多往前走一步】,其他情况同理,所以按照原本的顺序排列黑球的步数最少
代码如下
class Solution {
public:
long long minimumSteps(string s) {
long long ans=0;
for(int i=0,j=0;i<s.size();i++){//j表示下一个黑球应该在的位置
if(s[i]=='0'){
ans+=i-j;//黑球移到对应位置需要的步数
j++;
}
}
return ans;
}
};
三、最大异或乘积
这题跟位运算有关系,异或运算,相同为0,相异为1,思路如下
代码如下
//法1:时间复杂度O(n)
class Solution {
public:
const int MOD=1e9+7;
int maximumXorProduct(long long a, long long b, int n) {
long long ax=(a>>n)<<n,bx=(b>>n)<<n;
for(int i=n-1;i>=0;i--){
if(((a>>i)&1) == ((b>>i)&1)){//说明a和b的比特位相等
ax^=(1LL<<i);
bx^=(1LL<<i);
}else if(ax>bx){//说明a和b的比特位不相等,且ax>bx
bx^=(1LL<<i);
}else{
ax^=(1LL<<i);
}
}
return (ax%MOD)*(bx%MOD)%MOD;
}
};
//法2:时间复杂度O(1)
class Solution {
public:
const int MOD=1e9+7;
int maximumXorProduct(long long a, long long b, int n) {
if(a<b) swap(a,b);
long long mask=(1LL<<n)-1;
long long ax=a&(~mask),bx=b&(~mask);
long long diff=(a^b)&mask;//diff二进制为1表示可以分配给a或b的1
long long one=diff^mask;//将diff中的二进制为0的位置变成1
ax|=one;
bx|=one;
if(diff>0&&ax==bx){
long long high_bit=1LL<<(63-__builtin_clzll(diff));
ax|=high_bit;
diff^=high_bit;
}
bx|=diff;
return (ax % MOD) * (bx % MOD) % MOD;
}
};
四、找到Alice和Bob可以相遇的建筑
这个题目的题意就是要求我们找每次查询的两个位置(L,R)的右边有没有比他们都高的建筑,当然如果height[R]>height[L],那么直接返回R即可,如果L==R,直接返回当前位置,所以我们只要求当height[L]>height[R]时,右边高于heighs[L]的位置即可
class Solution {
public:
vector<int> leftmostBuildingQueries(vector<int>& heights, vector<vector<int>>& queries) {
int n=heights.size(),m=queries.size();
vector<int>ans(m,-1);
vector<vector<pair<int,int>>>left(n);//等待被查询的位置
for(int i=0;i<m;i++){
int l=queries[i][0],r=queries[i][1];
if(l>r) swap(l,r);
if(l==r||heights[r]>heights[l]){
ans[i]=r;
continue;
}
left[r].push_back({-heights[l],i});
}
priority_queue<pair<int,int>>q;
for(int i=0;i<n;i++){
while(q.size()&&-q.top().first<heights[i]){
ans[q.top().second]=i;
q.pop();
}
for(auto e:left[i]){
q.push(e);
}
}
return ans;
}
};