import java.util.Scanner; public class DNA { public static boolean match(char x, char y) { return x == 'A' && y == 'T' || x == 'T' && y == 'A' || x == 'C' && y == 'G' || x == 'G' && y == 'C'; } public static void main(String[] args) { Scanner s = new Scanner(System.in); int n = s.nextInt(); char[] a1 = new char[n]; char[] a2 = new char[n]; String str = s.next(); a1 = str.toCharArray(); String str1 = s.next(); a2 = str1.toCharArray(); char x; int count = 0; for (int j = 0; j < n; j++) { if (!match(a1[j], a2[j])) { int flag = 1; for (int i = j; i < n; i++) { if (match(a1[i], a2[j]) && match(a2[i], a1[j])) { x = a2[j]; a2[j] = a2[i]; a2[i] = x; flag = 0; count++; break; } //若满足交换后能同时配对两对碱基对,那么交换,否则不交换// } if (flag == 1) { count++; } } } System.out.println(count); } }
这道题目大概花了我一个小时,一开始想思路可能就十几分钟吧。这道题目考察的算法知识主要是模拟,一开始看起来挺难,但尝试之后发现思路还是比较清晰的,主要的问题还是在于思路实现上的一些小细节。
1.输入数据是连续的字符(非字符串)例如ACGTA,这时候就不好使用s.next().charAt(0)了。s.next()方法以空格符号为结束,连续的字符是无法直接读取的。先用s.next()方法读取字符串,再用.toCharArray()方法将其转化为字符数组。
2.判断碱基对交换的代码段中,一旦完成交换,应该立即break跳出循环。很多算法题中我都会犯类似的错误。