用其补码字符替换子字符串的字符

时间:2019-01-20 13:26:04

标签: java

我要求用户输入“ ATGC”,将其取反,然后用补码替换每个字符。在我的情况下,A和G互为补码,类似地T和C也是补码彼此的。我所期望的是,如果输入为AATGGCCC,则我的代码首先将其反转并生成CCCGGTAA,然后我需要一个补码逻辑,该逻辑应该给我像TTTAACGG这样的最终输出

我尝试了第一步,甚至我也尝试了计算补码的函数。我所做的是,我只是将反向字符串传递给函数,该函数经历if ... else条件,并通过使用contains()方法找到每个字母,如果将'A'替换​​为'G',但是并不是最佳选择,因为还有条件找到“ G”,如果存在“ G”,那么它将被“ A”代替,所以我对开发逻辑有些困惑。

class DNAString {

    private static String returnFinalComplement(String list) {
        String replace = null;
    for (int i = 0; i < list.length(); i++) {

        if (list.contains("A")) {
            list = list.replaceAll("A", "G");
        } else if (list.contains("G")) {
            list = list.replaceAll("G", "A");
        } else if (list.contains("T")) {
            list = list.replaceAll("T", "C");
        } else if (list.contains("C")) {
            list = list.replaceAll("C", "T");
        }

    }
    return list;
}

public static String reverseIt(String source) {
    int i, len = source.length();
    StringBuilder dest = new StringBuilder(len);

    for (i = (len - 1); i >= 0; i--) {
        dest.append(source.charAt(i));
    }

    return dest.toString();
}

public static void main(String[] args) {
    System.out.println("Enter the input");
    Scanner sc = new Scanner(System.in);
    String s = sc.nextLine();
    String reverseString = reverseIt(s);
    String revereStringComplement = returnFinalComplement(reverseString);
    System.out.println("reverse string " + revereStringComplement);

}
}

Enter the input
ATGC
reverse string CATA

预期输出:GCAT

2 个答案:

答案 0 :(得分:2)

如果您要坚持使用replaceAll,则需要输入一个中间字母。

list = list
   .replaceAll("A", "X") // Assuming someone hasn't invented an X base.
   .replaceAll("G", "A")
   .replaceAll("X", "G")
   .replaceAll("C", "X")
   .replaceAll("T", "C")
   .replaceAll("X", "T")
   ;

/* **Edit:** I think I've got that the right way around now. */ 

这类似于您要交换到变量的情况。说ab

int aOrig = a;
a = b;
b = aOrig;

爆炸String可能更好。

StringBuilder buff = new StringBuilder();
for (char c : list.toCharArray()) {
    buff.append(
        c=='G' ? 'A' :
        c=='A' ? 'G' :
        c=='T' ? 'C' :
        c=='C' ? 'T' :
        c // perhaps throw
    )
)
return buff.toString();

答案 1 :(得分:1)

您的returnFinalComplement在某些地方是错误的。首先,您要遍历字符串,但是每次在循环中执行的操作都会影响整个字符串,而不仅是当前正在查看的char。其次,您“首先”将每个A替换为G,然后将每个G替换为A,这意味着以前所有的AG现在是A

您可以更改returnFinalComplement的逻辑或完全删除它的逻辑,而可以使用reverseIt函数不附加source.charAt(i)而是附加其补语。