这个程序应该比较" DNA"字符串。
输入:
3
ATGC
TACG
ATGC
CGTA
AGQ
TCF
第一行表示程序运行的次数。每次运行时,它都会比较两个字符串。与T匹配,反之亦然。 G与C匹配,反之亦然。因此,如果字符串1的第一个字母是A,则字符串2的第一个字母应为T.如果下一个字母为T,则另一个字符串中的下一个字母应为A等等。如果字母不是A,T, G或C出现,这是一个不好的样本。如果它不好,打印出来就不好,如果好的话,打印出来就好了。我尝试了许多不同的组合,它们都运行良好,但根据法官的测试数据(他们有不同的输入),它失败了。有没有人看到这个有什么问题?我知道这可能不是完成工作的最有效方式,但至少在我理解的情况下确实如此。
输出:
GOOD
BAD
坏了
public class DNA
{
public static void main(String[] args) throws IOException
{
Scanner scan = new Scanner (new File ("dna.dat"));
int T = scan.nextInt();
scan.nextLine();
boolean valid = true;
for (int i = 0; i < T; i++)
{
String strand1 = scan.nextLine();
strand1 = strand1.toUpperCase();
String strand2 = scan.nextLine();
strand2 = strand2.toUpperCase();
for (int p = 0; p < strand1.length(); p++)
{
if (strand1.charAt(p) != 'A' && strand1.charAt(p) != 'T' && strand1.charAt(p) != 'G' && strand1.charAt(p) != 'C'
&& strand2.charAt(p) != 'A' && strand2.charAt(p) != 'T' && strand2.charAt(p) != 'G' && strand2.charAt(p) != 'C')
{
valid = false;
break;
}
if (strand1.length() != strand2.length())
{
valid = false;
break;
}
}
if (valid)
{
for (int p = 0; p < strand1.length(); p++)
{
if ((strand1.charAt(p) == 'A' && strand2.charAt(p) == 'T') || (strand1.charAt(p) == 'T' && strand2.charAt(p) == 'A')
|| (strand1.charAt(p) == 'G' && strand2.charAt(p) == 'C') || (strand1.charAt(p) == 'C' && strand2.charAt(p) == 'G'))
valid = true;
else
valid = false;
}
}
if (valid)
out.println("GOOD");
else
out.println("BAD");
valid = true;
}
}
}
我添加了toUpperCase并比较了相同长度的字符串,就像最后一次尝试一样,看看他们的数据是否有一些小写字母或不同长度的字符串,尽管它们应该都是相同的长度和大写。尽管如此,该计划仍被拒绝,因为他们没有通过评委测试数据。&#34;
答案 0 :(得分:1)
valid = false
时,您需要在第二个for循环中断。例如,如果字符1,2,3错误但#4匹配,您仍然会有效。
我会将字符串转换为数组以使事情变得更容易:
for (int i = 0; i < T; i++)
{
boolean valid = true;
String strand1 = scan.nextLine();
strand1 = strand1.toUpperCase();
String strand2 = scan.nextLine();
strand2 = strand2.toUpperCase();
if ( strand1.length() != strand2.length())
{
valid = false;
}
if (valid) {
char[] c1 = strand1.toCharArray();
char[] c2 = strand2.toCharArray();
for (int p = 0; p < c1.length; p++)
{
if (-1 == "ACTG".indexOf(c1[p]) || -1 == "ACTG".indexOf(c2[p]))
{
valid = false;
break;
}
}
if (valid)
{
for (int p = 0; p < c1.length; p++)
{
if (('A' == c1[p] && 'T' != c2[p]) ||
('T' == c1[p] && 'A' != c2[p]) ||
('C' == c1[p] && 'G' != c2[p]) ||
('G' == c1[p] && 'C' != c2[p])) {
valid = false;
break;
}
}
}
}
if (valid)
System.out.println("GOOD");
else
System.out.println("BAD");
}
答案 1 :(得分:0)
全部改变
&&
在
if (strand1.charAt(p) != 'A' && strand1.charAt(p) != 'T' && strand1.charAt(p) != 'G' && strand1.charAt(p) != 'C' && strand2.charAt(p) != 'A' && strand2.charAt(p) != 'T' && strand2.charAt(p) != 'G' && strand2.charAt(p) != 'C')
到
||
如果ANY,不是所有字符都不是A,T,G或C,那么我们退出循环。