leetcode 第 351 场周赛

文章包含四道编程题目,分别涉及计算数组中满足特定条件的对数、找到使整数变为零的最小操作数、数组划分成好子数组的方式以及模拟机器人碰撞并计算存活机器人的健康值。解题策略包括暴力求解、数学运算和排序算法。
摘要由CSDN通过智能技术生成

A 美丽下标对的数目

暴力
class Solution {
public:
    int countBeautifulPairs(vector<int>& nums) {
        int n=nums.size();
        int cnt=0;
        function<int(int,int)> gcd=[&](int a,int b)->int{
            return !b?a:gcd(b,a%b); 
        };
        for(int i=0;i<n;i++){
            int s=nums[i];
            while(s>=10){
                s/=10;
            }
            for(int j=i+1;j<n;j++){
                if(gcd(s,nums[j]%10)==1){
                    cnt++;
                }
            }
        }
        return cnt;
    }
};

B 得到整数零需要执行的最少操作数

首先考虑每次减 i 次的数 是否在规定步数 二进制中一的个数是否小于步数 而且需要提前判断当a-b之后a是否已经小于步数零 如果小于了 说明这个数是不可能成功的
class Solution {
public:
    int makeTheIntegerZero(int num1, int num2) {
        if(num2>=num1)return -1;
        long long a=num1,b=num2;
        for(int i=1;i<60;i++){
            a-=b;
            int cnt=0;
            if(a<=0)return -1;
            if(a<i)return -1;
            for(int j=0;j<60;j++){
                if(a>>j&1)cnt++;
            }
           
            if(cnt<=i)return i;
        } 
        return -1;
    }
};

C 2750. 将数组划分成若干好子数组的方式

就是两个1之间的0的个数+1 相乘 数学题
class Solution {
public:
    int numberOfGoodSubarraySplits(vector<int>& nums) {
        const int  N=1e9+7;
        int ans=1,pre=-1;
        for(int i=0;i<nums.size();i++){
                if(nums[i]==0)continue;
                if(pre>=0)ans=(long long )ans*(i-pre)%N;
                pre=i;
        }
        return pre<0?0:ans;
    }
};

D 机器人碰撞

利用结构体按照从左到右的position排序 这样排序完成后,用栈把往右边走的存入 如果遇见往左边走的就进行减少,就行了,然后再根据id排序输出
struct ta{
    int id,po,hs;
    char ch;
};
bool cmp(ta a,ta b){
        return a.po<b.po;
    }
bool cmp1(ta a, ta b){
    return a.id<b.id;
}
class Solution {
public:
    vector<int> survivedRobotsHealths(vector<int>& positions, vector<int>& healths, string directions) {
        int n=positions.size();
        vector<ta>v,tt;
        for(int i=0;i<n;i++){
            v.push_back({i+1,positions[i],healths[i],directions[i]});
        }
        sort(v.begin(),v.end(),cmp);
        stack<ta> st;
        for(int i=0;i<n;i++){
            while(st.size() && v[i].ch=='L'&&v[i].hs>0){
                if(v[i].hs>st.top().hs){
                    st.pop();
                    v[i].hs--;
                }
                else if(v[i].hs==st.top().hs){
                    st.pop();
                    v[i].hs=0;
                }
                else {
                   st.top().hs--; 
                    v[i].hs=0;
                }
            }
            if(v[i].ch=='R')st.push(v[i]);
            if(st.size()==0 &&v[i].ch=='L' && v[i].hs!=0)tt.push_back(v[i]);
        }
      while(st.size()){
        tt.push_back(st.top());
         st.pop();
      }
        sort(tt.begin(),tt.end(),cmp1);
        vector<int> ts;
        for(auto x:tt){
            ts.push_back(x.hs);
        }
        return ts;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值