leetcode 第 234 场周赛解题报告

本文介绍了四个算法题目,涉及字符串中不同整数的计数、还原排列的最少操作步数、替换括号内容以及找到好因子的最大数目。通过暴力枚举、数据结构和数学分析的方法,分别给出了C++代码实现。这些问题考察了数字处理、字符串操作和数学逻辑能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比赛链接

5713. 字符串中不同整数的数目

题解:暴力枚举把字符串中的数字筛选出来,用数据结构去重即可(set,map,hashmap)均可

代码如下:

class Solution {
public:
    int numDifferentIntegers(string word) {
        set<string> se;
        string cur="";
        bool zero=false;
        for(int i=0;i<int(word.size());i++)
        {
            if(word[i]>='0'&&word[i]<='9')
            {
                if(cur==""&&word[i]=='0')
                {
                    zero=true;
                    continue;
                }
                zero=false;
                cur+=word[i];
            } else {
                if(zero)
                {
                    se.insert("0");
                    zero=false;
                }
                if(cur!="")
                {
                    se.insert(cur);
                    cur="";
                }
            }
        }
        if(zero)
        {
            se.insert("0");
            zero=false;
        }
        if(cur!="")
        {
            se.insert(cur);
            cur="";
        }
        return int(se.size());
    }
};

1806. 还原排列的最少操作步数

题解:暴力模拟即可,更简单的方法,不用模拟所有数字,只需要枚举数字1回到位置1用了多少步就行了,代码如下:

class Solution {
public:
    int reinitializePermutation(int n) {
        int ret=1;
        int cur=n/2;
        while(cur!=1)
        {
            if(cur%2==0)
                cur/=2;
            else
                cur=n/2+(cur-1)/2;
            ret++;
        }
        return ret;
    }
};

5714. 替换字符串中的括号内容

题解:用数据结果map或hashmap存储下映射关系,模拟即可

class Solution {
public:
    string evaluate(string s, vector<vector<string>>& knowledge) {
        unordered_map<string,string> mp;
        for(int i=0;i<int(knowledge.size());i++)
        {
            mp[knowledge[i][0]]=knowledge[i][1];
        }
        string ret="";
        for(int i=0;i<int(s.size());i++)
        {
            if(s[i]=='(')
            {
                string tem="";
                for(i=i+1;i<int(s.size());i++)
                {
                    if(s[i]==')')
                    {
                        if(mp.find(tem)==mp.end())
                        {
                            ret+="?";
                        } else {
                            ret+=mp[tem];
                        }
                        break;
                    }
                    tem+=s[i];
                }
            } else {
                ret+=s[i];
            }
        }
        return ret;
    }
};

5716. 好因子的最大数目

题解:问题可以抽象为,把一个正整数n(1<=n<=10^9),分解任意k(1<=k<=n)个整数a1,a2...ak,(a1+a2+....ak=n),求这k个数的乘积最大为多少?答案模以10^9+7

我们定义f(x)x分解后乘积的最大值。

我们可以观察:

f(1)=1,分解为单个数(1)

f(2)=2,分解为单个数(2)

f(3)=3,分解为单个数(3)

f(4)=4,分解为(2,2)

f(5)=6,分解为(2,3)

f(6)=9,分解为(3,3)

f(7)=12,分解为(2,2,3)

f(8)=18,分解为(2,3,3)

f(9)=27,分解为(3,3,3)

我们可以观察到f(x)>=x

x>3时:假设我们首先分解为两个数a,bx=a+b

f(a)>a的时候,我们一定会继续往下分解直到f(a)==aa<=3,显然1对于最后乘积变大没有意义,所以1<a<=3

b同理。

所以最后x一定是分解为若干个3加若干个2。

由于(3*3=9)>(2*2*2=8)

所以最后x一定是分解为若干3加(0或1或2)个2之和,这样f(x)的值最大。

利用快速幂进行计算即可。

代码如下:

class Solution {
public:
    long long POW(long long x,long long y,long long mo)
    {
        long long ret=1;
        x%=mo;
        while(y)
        {
            if(y&1)
                ret=(ret*x)%mo;
            x=(x*x)%mo;
            y>>=1;
        }
        return ret;
    }
    int maxNiceDivisors(int primeFactors) {
        if(primeFactors==1)
            return 1;
        else if(primeFactors==2)
            return 2;
        int l=1,r=primeFactors;
        int mo=1000000007;
        int N3=primeFactors/3;
        if(primeFactors%3==1)
        {
            return (POW(3,N3-1,mo)*4)%mo;
        } else if(primeFactors%3==2){
            return (POW(3,N3,mo)*2)%mo;
        }
        return POW(3,N3,mo);
    }
};

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值