0

在我的课堂上,我的任务是用 Java 编写一个程序,告诉你存储在一个数组中的 2 个长度为 8 的 DNA 序列是否相同。然而,序列可以是循环的。例如,这两个是相同的:

ATGCGTAT

ATATGCGT

我编写了代码来检查索引 0 处的两个数组是否相同,如果是,则转到检查数组方法,如果不是,则将 1 添加到第二个数组的索引并重新开始。但是我很困惑,因为我不确定如何输入检查方法通过两个数组的新索引,或者如何循环索引(即从 7 回到 0)。

对不起,如果代码是垃圾,我是一个初学者,发现这个问题很混乱。提前致谢 :)

/* checking whether the two arrays are equal at a certain index

for (x=0;x<8;) {
            for (y=0;y<8;) {
                if (DNAarray1[x] == DNAarray2[y]) {
                    isEqual(ADNarray1, ADNarray2);
                } else y++;
            }
        }

/* isEqual method - my issue is with how I can take x and y from above and carry them into this method.
And also how to loop this back round so the index of y goes from 7 back to 0.

static boolean isEqual(int[] ADN1, int[] ADN2) {
        for (int c = 1; c < 8; c++) {
            if (ADN1[x + c] == ADN2[y + c]) {
                return true;
            } else return false;
        }
    }
4

3 回答 3

0

要将 x 和 y 添加到方法中,只需添加相同名称的参数。要在 7 后返回 0,请使用模运算符 %。

这是您的代码,包含必要的更改和一些修复:

static boolean isCyclicEqual(int[] DNA1, int[] DNA2) {
    for (x=0;x<8;x++) {
        for (y=0;y<8;y++) {
            if (isEqual(DNAarray1, x, DNAarray2, y)) {
                return true;
            }
        }
    }
    return false;
}

static boolean isEqual(int[] DNA1, int x, int[] DNA2, int y) {
    for (int c = 0; c < 8; c++) {
        if (DNA1[(x + c) % 8] != DNA2[(y + c) % 8]) {
            return false;
        }
    }
    return true;
}
于 2021-11-18T20:03:31.827 回答
0

如果将 DNA 序列表示为字符串/字符串数组,则使用Collections.rotate方法执行循环移位可能会很方便:

static boolean isEqual(String[] one, String[] two) {
    if (one.length != two.length) return false; // verify the length
    
    List<String> sec = Arrays.asList(two);
    
    for (int i = 0; i < one.length; i++) {
        if (Arrays.equals(one, two)) {
            System.out.println("equal at position=" + i);
            return true;
        }
        Collections.rotate(sec, -1); // contents of `two` is rotated as well
    }
    System.out.println("non-equal");
    return false;
}

测试:

isEqual("ATGCGTAT".split(""), "ATATGCGT".split(""));
isEqual("ATGCGTAT".split(""), "TATGGCTA".split(""));

输出:

equal at position=2
non-equal
于 2021-11-18T22:58:33.617 回答
0

如果数组中只有8元素,那么性能对于解决方案并不重要。那么它可能是这样的:

public static boolean isEqualCycle(char[] one, char[] two) {
    String strOne = new String(one);
    String strTwo = new String(two);

    for (int i = 0; i < one.length; i++) {
        if (strOne.equalsIgnoreCase(strTwo))
            return true;
        strTwo = strTwo.charAt(strTwo.length() - 1) + strTwo.substring(0, strTwo.length() - 1);
    }

    return false;
}

另一个灵魂是使用额外的数组:

public static boolean isEqualCycle(char[] one, char[] two) {
    char[] tmp = Arrays.copyOf(two, two.length);

    for (int i = 0; i < one.length - 1; i++) {
        if (isEqual(one, tmp))
            return true;
        rotateRight(tmp);
    }

    return false;
}

private static boolean isEqual(char[] one, char[] tmp) {
    for (int i = 0; i < one.length; i++)
        if (one[i] != tmp[i])
            return false;
    return true;
}

private static void rotateRight(char[] arr) {
    for (int i = 0, j = arr.length - 1; i < j; i++, j--)
        swap(arr, i, j);
    for (int i = 1, j = arr.length - 1; i < j; i++, j--)
        swap(arr, i, j);
}

private static void swap(char[] arr, int i, int j) {
    char tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}
于 2021-11-18T21:16:35.477 回答