目录
牛客.字符串替换
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); } }