第三十五次CCF-CSP认证字符串变换(第二题)Java题解(80分)

 解题方法:记录从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();
		}
	}

}

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

题目:

 

 

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值