【问题标题】:Incorrect logic comparing strings?比较字符串的逻辑不正确?
【发布时间】:2014-03-22 03:16:58
【问题描述】:

这个程序应该比较“DNA”字符串。

输入:
3
ATGC
TACG
ATGC
CGTA
AGQ
TCF

第一行表示程序将运行多少次。每次运行时,它都会比较两个字符串。 A 与 T 匹配,反之亦然。 G 与 C 匹配,反之亦然。因此,如果字符串 1 的第一个字母是 A,则字符串 2 的第一个字母应该是 T。如果下一个是 T,则另一个字符串上的下一个字母应该是 A 等等。如果不是 A、T、 G,或C出现,它是一个坏样本。如果是坏的,打印出坏的,如果是好的,打印出好的。我对此尝试了许多不同的组合,它们都运行良好,但根据法官的测试数据(他们有不同的输入),它失败了。有人看到这有什么问题吗?我知道这可能不是完成工作的最有效方式,但至少在我的理解中确实如此。

输出:
好
不好
不好

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 并比较了相同长度的字符串,就像最后一次尝试查看它们的数据是否可能有一些小写字母或不同长度的字符串,尽管它们应该都是相同的长度和大写。尽管如此,该程序仍然以“未通过评委测试数据”而被拒绝。

【问题讨论】:

    标签: java regex for-loop boolean logic


    【解决方案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");
    }
    

    【讨论】:

      【解决方案2】:

      全部更改

      &&
      

      在

      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,not ALL 字符不是 A、T、G 或 C,则退出循环。

      【讨论】:

      • 如果我把它改成||,即使它是真的,那不是让它假吗?例如,如果我们有 ACG,它将不满足第一个条件 strand1.charAt(p) != 'A' 因此,使其为假。如果它的 &&,它检查所有字符是 A、C、G 或 T。如果它们不是 A、C、G 或 T,则布尔值设置为 false,如果它们是,它保持真实并继续执行该计划的其余部分。
      猜你喜欢
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多