Codingbat sameStarChar练习

时间:2014-03-16 22:04:24

标签: java

我在编码练习时遇到了麻烦:

如果字符串中的每个*(星号),如果在星号之前和之后都有字符,则返回true,它们是相同的。

sameStarChar(" xy yzz")// true sameStarChar(" xy zzz")// false sameStarChar(" xa az")// true

正确的答案是:

public boolean sameStarChar(String str) {
    for (int i = 1; i < str.length() - 1; i++) {
        if (str.charAt(i) == '*' && str.charAt(i - 1) != str.charAt(i + 1)) {
            return false;
        }
    }
    return true;
}

我写的是:

public boolean sameStarChar(String str) {
    for (int i = 1; i < str.length() - 1; i++) {

        if (str.substring(i, i + 1) == "*" && str.substring(i - 1, i) != str.substring(i + 1, i + 2)) {
            return false;
        }
    }
    return true;
}

我无法理解子字符串和charAt方法。

5 个答案:

答案 0 :(得分:2)

<强>说明:

如果对于字符串中的每个'*'(星号),如果在星号之前和之后都有字符,则返回true,它们是相同的。

sameStarChar("xy*yzz") → true
sameStarChar("xy*zzz") → false
sameStarChar("*xa*az") → true

伪代码

遍历从1到长度为1的每个字符。如果字符是星号,并且前面的字符与之后的字符不同,则返回false。否则,如果到达终点,则返回true。

代码:

public boolean sameStarChar(String str){
  int len = str.length();
  for(int x = 1; x < len-1; x++){
    if (str.charAt(x) == '*' && str.charAt(x-1) != str.charAt(x+1)){
      return false;
    }
  }
  return true;
}

<强>注释:

这是线性时间O(n)操作。

答案 1 :(得分:0)

在这种情况下,

str.charAt()更容易阅读和理解。

此外,您的子字符串解决方案应该更像

if (str.substring(i, i + 1).equals("*") && 
        !str.substring(i - 1, i).equals(str.substring(i + 1, i + 2))){
//etc.
}

Substring返回一个字符串,并比较你必须使用.equals()方法的文字刺痛值。

答案 2 :(得分:0)

相反,我计算'*'的数量和匹配的对的数量,并检查它们是否相等并返回true。

public boolean sameStarChar(String str) {
  int count=0, noOfPairs=0;
  for(int i=1; i<str.length()-1;i++){
    if(str.charAt(i)=='*') count++;
    if(str.charAt(i)=='*' && str.charAt(i+1)==str.charAt(i-1)) noOfPairs++;
  }
  if(count==noOfPairs) return true;
  return false;
}

答案 3 :(得分:0)

另一种解决方案...

public boolean sameStarChar(String str) {
  
  if(str.length()==0) return true;
  if(str.length()==1 && str.contains("*")) return true;
  if(!str.contains("*")) return true;

  int i = 0;
  boolean result = false;
  while(i<str.length()-1){
    if(i!=0 &&  str.charAt(i) == '*' && str.charAt(i-1) == str.charAt(i+1)){
      result = true;
    }else if(i!=0 && str.charAt(i) == '*' && str.charAt(i-1) != str.charAt(i+1)){
      result = false;
    }else if(str.charAt(i) == '*'){
      result = true;
    }
    i++;
  }
  
  return result;
}

答案 4 :(得分:0)

不使用 indexOf(int ch, int fromIndex) 迭代字符串中每个单独字符的版本

public boolean sameStarChar(String str) {
  int i=0;
  int l=str.length();
  for(i=str.indexOf("*",i);i!=-1;i=str.indexOf("*",i+1))
  {
    if(i==0 || i==l-1)    //saves the program from accessing an out of bounds Index
    continue;
    else
    {
      if(str.charAt(i-1)!=str.charAt(i+1));
      return false;
    }
  }
  return true;
}