Leetcode---372周赛

题目列表

2937. 使三个字符串相等

2938. 区分黑球与白球

2939. 最大异或乘积

2940. 找到 Alice 和 Bob 可以相遇的建筑

一、使三个字符串相等

Leetcode---372周赛_第1张图片

这题把题目意思读懂,正常模拟就行,简单来说就是看三个字符串的最长公共前缀有多长,

代码如下

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

二、区分黑球和白球

Leetcode---372周赛_第2张图片

这题其实可以根据所给的示例,手玩一下,你就会发现最短的步数就是将黑球按照顺序从左往右依次排好需要的步数,

可能有人不太理解,我简单解释一下:假设有两个黑球分别在下标x、y (x

代码如下

class Solution {
public:
    long long minimumSteps(string s) {
        long long ans=0;
        for(int i=0,j=0;i

三、最大异或乘积

Leetcode---372周赛_第3张图片

这题跟位运算有关系,异或运算,相同为0,相异为1,思路如下

Leetcode---372周赛_第4张图片

代码如下 

//法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)<=0;i--){
            if(((a>>i)&1) == ((b>>i)&1)){//说明a和b的比特位相等
                ax^=(1LL<bx){//说明a和b的比特位不相等,且ax>bx
                bx^=(1LL<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可以相遇的建筑

Leetcode---372周赛_第5张图片

这个题目的题意就是要求我们找每次查询的两个位置(L,R)的右边有没有比他们都高的建筑,当然如果height[R]>height[L],那么直接返回R即可,如果L==R,直接返回当前位置,所以我们只要求当height[L]>height[R]时,右边高于heighs[L]的位置即可

class Solution {
public:
    vector leftmostBuildingQueries(vector& heights, vector>& queries) {
        int n=heights.size(),m=queries.size();
        vectorans(m,-1);
        vector>>left(n);//等待被查询的位置
        for(int i=0;ir) swap(l,r);
            if(l==r||heights[r]>heights[l]){
                ans[i]=r;
                continue;
            }
            left[r].push_back({-heights[l],i});
        }

        priority_queue>q;
        for(int i=0;i

你可能感兴趣的:(leetcode,算法,职场和发展)