第三十五次CCF-CSP认证字符串变换(第二题)Java题解(80分) 记录从1到max(m)的查询结果,再根据查询输出

 解题方法:记录从1到max(m)的查询结果,再根据查询输出

注:题目在文末

我的题解:

import java.io.BufferedInputStream;
import java.util.Scanner;
public class Main2 {
	public static void main(String[] args) {
	Scanner sc = new Scanner(new BufferedInputStream(System.in));
	char[] cs = sc.nextLine().toCharArray();//定义并输入原始的字符串
	int len = cs.length;//原始字符串长度(包括前后两个‘#’)
	int[] css = new int[len];//在后续循环的时候,判断该字符串某位置是否有变动
	int n = sc.nextInt();//字符对个数
	char[] cc = sc.nextLine().toCharArray();//消除一个按行输入
	char[][] c = new char[n][4];//定义字符对数组
	for (int i = 0;i < n;i++) {//输入字符对
	c[i] = sc.nextLine().toCharArray();
	}
	int m;//定义查询个数
	m = sc.nextInt();//输入查询个数
	int[] k = new int[m];//定义m个查询的数组
	for (int i = 0;i < m;i++) {//输入m个查询
	k[i] = sc.nextInt(); 
	}
	int max = 0;//定义max找到查询的最大值(次数)
	for (int i = 0;i < m;i++) {//找到max
	max = Math.max(max, k[i]);
	}
	char[][] kk = new char[max][len];//定义一个数组记录从1-max的查询(变换)
	int ii = 0;//第几个变换
	while (max-- > 0) {//循环max次填充kk数组
	for (int i = 0;i < n;i++) {//用i循环遍历各个字符对
	for (int j = 0;j < len;j++) {//用j循环遍历原始字符串并更改(可能已经更新)
	if (css[j] == 0 & cs[j] == c[i][1]) {//如果第j+1个字符在for循环(i)里没有遍历过并且符合字符对变换则修改原始字符串并将css数组相应位置标为1
	cs[j] = c[i][2];
	css[j] = 1; 
	}
	}
	}
	for (int i = 0;i < len;i++) {//遍历kk[i]数组,将更改后的原始字符串传入kk[i],并取消css标记
	kk[ii][i] = cs[i]; 
	css[i] = 0; 
	}
	ii++;//变换次数加一
	}
	for (int i = 0;i < mm;i++) {//根据之前的查询数组输出查询结果
	int x = k[i];
	for (int j = 0;j < len;j++) {
	System.out.print(kk[x - 1][j]);
	}
	System.out.println();
	}
	}
}

解题注意:当字符串的某个位置在本次变换中前面的字符对遍历过了,本次变换应该保持不变;同时,题目没有说查询保证顺序或递增,因此需要用到记录的方法

题目:

 

 

作者:粒子353原文地址:https://blog.csdn.net/weixin_74948120/article/details/142487777

%s 个评论

要回复文章请先登录注册