Leetcode Weekly Contest 234(详细解析)

题目链接: Leetcode Weekly Contest 234

写在前面:

本次周赛难度不大,但只做出了前两题,第三题在比赛结束后做出来了,手速还需提高。

1、1805. Number of Different Integers in a String

难度:Easy

题目大意:

将字符串中的字母有空格代替,如何以空格作为间隔将字符串中的数字分隔开,求字符串中有多少个不同的数值。012和12表示的数值相同。比较无聊的一道题,没那么容易做,磨了快半小时,写的代码比较丑。

思路:

按照题意一步步模拟。

代码

class Solution {
    public int numDifferentIntegers(String word) {
        StringBuilder sb=new StringBuilder(word);
        for(int i=0;i<sb.length();i++){
            if(sb.charAt(i)>='a'&&sb.charAt(i)<='z'){
                sb.setCharAt(i,' ');
            }
        }
        String s1=sb.toString();
        s1=s1.trim();//去除首尾空格
        if(s1.length()==0){
            return 0;
        }
        String[] strArr=s1.split("\\s+");//把空格都去掉
        Set<Integer> set=new HashSet<>();
        for(String s:strArr){
            int sum=0;
            int len=s.length();
            int p=0;
            while(p<len&&s.charAt(p)=='0'){
                p++;
            }
            for(int i=p;i<len;i++){
                int a=s.charAt(i)-'0';
                sum=sum*10+a;
            }
            set.add(sum);
        }
        return set.size();
    }
}

2、1806. Minimum Number of Operations to Reinitialize a Permutation

难度:Medium

题目大意:

详见题目。

思路:

找规律,追踪数字1的下标即可。

代码

class Solution {
    public int reinitializePermutation(int n) {
        int count=0;
        int half=n/2;
        int i=1;//追踪1的下标
        if(n==2){
            return 1;
        }
        i=i*2;
        count++;
        while(i!=1){
            if(i<half){
                i=i*2;
                count++;
            }
            else{
                i=1+2*(i-half);
                count++;
            }
        }
        return count;
    }
}

3、1807. Evaluate the Bracket Pairs of a String

难度:Medium

题目大意:

给出一个字符串和二维数组,二维数组中每个元素含有两个字符串,分别表示key和对应的value,将字符串中括号内的key用相应的value代替。

思路:

按照题意一步步模拟即可。

代码

class Solution {
    public String evaluate(String s, List<List<String>> knowledge) {
        Map<String,String> map=new HashMap<>();
        for(List<String> l:knowledge){
            map.put(l.get(0),l.get(1));
        }
        StringBuffer sb=new StringBuffer(s);
        int i=0;
        while(i<sb.length()){
            while(i<sb.length()&&sb.charAt(i)!='('){
                i++;
            }
            if(i>=sb.length()){
                break;
            }
            int left=i;
            while(i<sb.length()&&sb.charAt(i)!=')'){
                i++;
            }
            int right=i;
            String s1=sb.substring(left+1,right);
            if(map.containsKey(s1)){
                String value=map.get(s1);
                sb.replace(left,right+1,value);
                //替换后sb的长度会发生变化,所以要更新i的位置
                int diff=(right-left+1)-value.length();
                i=i-diff;
                i++;
            }
            else{
                sb.replace(left,right+1,"?");
                int diff=(right-left+1)-1;
                i=i-diff;
                i++;
            }
        }
        return sb.toString();
    }
}
}

4、1808. Maximize Number of Nice Divisors

难度:Hard

题目大意:

详见题目。

思路

参考高赞回答。是一道数学题,与leetcode343类似。

代码

class Solution {
    public int maxNiceDivisors(int primeFactors) {
        int n=primeFactors;
        int M=1000000007;
        int a=n/3,b=n%3;//a=3*a+b
        if(n<=3){
            return n;
        }
        long res=0;
        if(b==0){
            res=quickPow(3,a);
        }
        else if(b==1){
            res=quickPow(3,a-1)*4%M;
        }
        else{
            res=quickPow(3,a)*2%M;
        }
        return (int)res%M;
    }
    
    public long quickPow(long x,int n){//Leetcode50,求pow(x,n)
        int M=1000000007;
        long ans=1;
        while(n>0){
            if(n%2==1){
                ans=ans*x;
                ans=ans%M;//运算过程中取模,防止溢出
            }
            x=x*x;
            x=x%M;
            n/=2;
        }
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值