牛客.字符串替换​编辑神奇数牛客DNA序列牛客.kotori和气球

目录

牛客.字符串替换​编辑

神奇数

牛客DNA序列

牛客.kotori和气球


牛客.字符串替换

import java.util.*;

public class StringFormat {
    public String formatString(String A, int n, char[] arg, int m) {
//这里是使用了StringBuffer来去接受这个
      StringBuffer ret=new StringBuffer();
      char[]s=A.toCharArray();
      int j=0;
      for(int i=0;i<n;i++){
//有可能最后一个只是%,并没有s,不是百分号,我们就把对应的添加进去
        if(s[i]!='%'){
            ret.append(s[i]);
        }else{
//假如后面碰巧还遇上了s,那么就说明是%s,此时你就需要在ret添加arg的值,然后再去++,
            if(i+1<n&&s[i+1]=='s'){
                ret.append(arg[j++]);
当我们添加之后,需要++因为 这个是%下个是s,我们都把她给跳过了。
                i++;
            }else{
如果%后面不是s,其实没有这个可能不写也行
                ret.append(s[i]);
            }
        }
      }
//不用思考下标的关系,而是直接添加会省很多麻烦
//假如j<m 也就是说没有遍历完全,我需要把剩下的添加到ret里面
      while(j<m){
        ret.append(arg[j++]);
      }
      return ret.toString();

    }
}

我初始想法,是转换成数组,在用另一个数组去接收她,这也就导致,我需要在里面考虑非常多的下标问题,这也给我带来很多苦恼,所以在最后一个样例中,我卡住了,我如果花费些许时间,或许能想出来,但是一个好的方法是优于你的思考的

神奇数

我们首先是要关注每一位的关系,

细节: 1.用i来表示十位,j来表示各位,并且i不可以为0,因为不可以出现前导0,

          2. i!=j的 

2.判断是否是质数;试除法

从2开始到n(因为1不是质数) (2-根号n)闭区间,这个代码的逻辑结构比我想的好很多,写的十分清晰,我就想着都放到一起,这也导致,我的代码看起来复杂,并且冗余

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    //判断是否是质数
    public static boolean isprim(int x){
        if(x<2){
            return false;
        }else{
            for(int i=2;i<=Math.sqrt(x);i++){
                if(x%i==0)return false;
            }
            return true;
        }
    }
    //判断是否是神奇数
    public static int check(int x){
        //让他绝对够存储
     int []num=new int[10];
     int n=0;
     while(x!=0){
        num[n]=x%10;
        x=x/10;
        n++;
     }
     //枚举十位数
     for(int i=0;i<n;i++){
        //枚举个位数
        for(int j=0;j<n;j++){
       if(num[i]!=0&&i!=j){
        if(isprim(num[i]*10+num[j])){
            return 1;
        }
       }
        }
     }
     return 0;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
            int a = in.nextInt();
            int b = in.nextInt();
            int ret=0;
            //取max的原因,因为1,2,3这种都是个位数,绝对不可能是神奇数
            for(int i=Math.max(a,10);i<=b;i++){
                ret+=check(i);
                }
                System.out.println(ret);
            }
}

牛客DNA序列

我掏他猴子的很奇怪啊,玛多笔试强训里面没这么多说明,根本看不懂,还没有那个数字,痛苦,还好回来,看了题解明白了啥意思,肯定是滑动窗口我知道。但是我的失误地方,他给的比率很迷惑我,我没想到可以不求比率,而是直接就去获取CG数量,根本不用除别的,因为如果CG的数量越多,他的长度是固定的,那么他的比率就越大

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String aa = in.nextLine();
        int n = in.nextInt();
        int count = 0;
        int maxCount = 0;
        char[]a = aa.toCharArray();
        int left = 0;
//这里begin的来标记目标序列的开头
        int begin = 0;
//这个right作为窗口
        int right = 0;
        //滑动窗口
        while (right < a.length) {
            if (a[right] == 'C' || a[right] == 'G')count++;
//当我们窗口过大的时候,需要移动窗口,即把left指针,像右移动,假如原本是c或者g那么,你需要进行更改。
            while (right - left + 1 > n) {
                if (a[left] == 'C' || a[left] == 'G') {
                    count--;
                }
                left++;
            }
//假如等于来,我们只需要保存开始的值,因为他给了目标序列的长度,所以输这么长即可
            if (right - left + 1 == n) {
                if (count > maxCount) {
                    begin = left;
//看一看符合要求的序列的长度够不够
                    maxCount = count;
                }
            }
            right++;
        }
        for (int i = begin; i < begin + n; i++) {
            System.out.print(a[i]);
        }


    }

}

牛客.kotori和气球

n种*(n-1)(n-1)...一个循环即可,但是每次乘完就要对109去模

import java.util.*;
public class Main{
    public static void main(String[]args){
    Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int m=in.nextInt();
        int ret=n;
        for(int i=0;i<m-1;i++){
            ret=ret*(n-1)%109;
        }
        System.out.print(ret);
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗哥不是甜妹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值