在尝试理解编码包分配的解决方案时感到困惑

时间:2014-07-15 07:08:39

标签: java

来自codingbat.com的问题是我无法理解解决方案。

Given a string, return a version where all the "x" have been removed. 
Except an "x" at the very start or end should not be removed. 

stringX("xxHxix") → "xHix"
stringX("abxxxcd") → "abcd"
stringX("xabxxxcdx") → "xabcdx"

以下是他们提供的解决方案:

public String stringX(String str) {
  String result = "";
  for (int i=0; i<str.length(); i++) {
    // Only append the char if it is not the "x" case
    if (!(i > 0 && i < (str.length()-1) && str.substring(i, i+1).equals("x"))) {
      result = result + str.substring(i, i+1); // Could use str.charAt(i) here
    }
  }
  return result;
}

如果有人可以分解if语句中的复杂逻辑,那将非常有用。否定运算符(!)是否适用于整个if语句或仅适用于第一组括号内的内容? if语句让我很困惑。

提前谢谢。

6 个答案:

答案 0 :(得分:2)

为清楚起见,让我们重新格式化if声明:

if (
    !(
       i > 0 
       && i < (str.length()-1) 
       && str.substring(i, i+1).equals("x")
     )
   )

i > 0 && i < (str.length()-1)检查元素是否在String的两个结束索引之间。

str.substring(i, i+1).equals("x")检查当前元素是否具有值&#39; x&#39;。

最后,否定适用于上述两个陈述的逻辑AND。

用简单的英语,这将是,&#34;将当前字母附加到你的字符串,如果它在一个末尾,或者它是在极端之间而不等于x&#34;。

答案 1 :(得分:2)

上面的代码与否定每个部分相同,如

if (i != 0 && i != str.length() -1 && !str.substring(i, i+1).equals("x")) {
  result = result + str.substring(i, i+1); // Could use str.charAt(i) here
}

答案 2 :(得分:0)

public String stringX(String str) {

    int len = str.length();
    String word = "";

    for (int i=0; i<len; i++){
        if (!(i>0 && i < len-1 && str.charAt(i)=='x')){
            word += str.charAt(i);
        }
    }

    return word;
}

答案 3 :(得分:0)

我希望您会喜欢以下代码:

public static String stringX(String str) {
    if(str.length()<2){
        return str;
    }

    String sub_first = str.substring(0, 1);
    String sub_last = str.substring(str.length() - 1);
    String sub_mid = str.substring(1, str.length() - 1);

    for (int i = 0; i < sub_mid.length(); i++) {

        if (sub_mid.charAt(i) == 'x') {
            sub_mid = sub_mid.replace("x", "");

        }
    }
    return sub_first + sub_mid + sub_last;

}

答案 4 :(得分:0)

最好考虑这个解决方案。
下面的解决方案与您给出的更清晰相同。

  • StrHasChanged - 检查字符串是否包含“X”。
  • 然后在字符之前从第二个到最后一个迭代。
  • 如果 StrHasChanged 为 false,则返回原始字符串或返回修改后的字符串。
public String stringX(String str) {
  String newStr = "";
  Boolean StrHasChanged = false;
  
  if (str.length() > 1) {
    for (int itr = 1; itr < str.length()-1; itr ++) {
      if (str.charAt(itr) != 'x') {
        StrHasChanged = true;
        newStr = newStr + Character.toString(str.charAt(itr));
      }
    }
  }
  
  return ((str.length() == 1) || (!(StrHasChanged))) ? str : Character.toString(str.charAt(0)) + newStr + Character.toString( str.charAt(str.length()-1) );
}

答案 5 :(得分:-1)

public String stringX(String str) {
    if (str.length() <= 3)
        return str;
    else {
        String c = str.substring(0, 1);
        String d = str.substring(str.length() - 1, str.length());
        String a = str.replaceAll("x", "");
        if ((c.equals("x")) && (d.equals("x")))
            return c + a + d;
        else if (c.equals("x"))
            return c + a;
        else if (d.equals("x"))
            return a + d;
        else
            return a;
    }
}