4

我正在尝试编写一个方法,该方法返回 char c 首次在 s 中连续出现的次数,即使它是该字符的单次出现。即使是空格也会打破连续计数。所以字符串“我不擅长编程”。如果 char c 是“a”,则应该只返回 1。

下面的代码编译但不打印正确的答案。只是在处理这个问题时显示我的一般逻辑。

public class WordCount
{
  public int countRun( String s, char c )
  {
    int counter = 0;
    for( int i = 0; i < s.length(); i++)
    /*There should be other conditions here that checks for first
      appearance consecutively. I've tried my fair share, but no
      luck on getting correct results.*/
    {
      if( s.charAt(i) == c )
      {
        counter += 1;
      }
    }
    return counter;
  }

  public static void main( String args[] )
  {
    WordCount x = new WordCount();
    System.out.println( x.countRun( "Add dog", 'd' ) ); //should return 2
    System.out.println( x.countRun( "Add dog", 'D' ) ); //should return 0
    System.out.println( x.countRun( "Hope you're happy", 'p' )); //should return 1
    System.out.println( x.countRun( "CCCCCcccC", 'C' )); //should return 5
  }
}

我只需要一些指针(逻辑或代码)。也许有一种我以前从未见过的字符串方法可以使我的程序更简单。我在编程和 Java 方面的知识非常有限。

编辑:对于任何想知道这是否是一些家庭作业的一部分或诸如此类的人,这是一个非常古老的期中考试的问题。我弄错了,但由于某种原因,但当时从未费心要求正确答案。我今天看了看,想看看我是否知道答案。好像我没有

4

4 回答 4

7

你可以在一行中做到这一点:

int result = s.replaceFirst(".*?(" + c + "+).*", "$1").length();

这段代码使用正则表达式从本质上提取s第一个连续出现的部分 c,然后获取它的长度。

这也适用于发生任何情况,产生零。

现场演示

于 2013-05-31T04:38:58.280 回答
3

添加一个标志,当你找到一个匹配的字符时跳出循环,然后找到“任何其他”。也许不是最紧凑或最优雅的,但对原始代码是真实的。经过测试,并按预期产生 2,0,1,5。

public int countRun( String s, char c )
  {
    int counter = 0;
    boolean foundOne = false;
    for( int i = 0; i < s.length(); i++)
    {
      if( s.charAt(i) == c )
      {
        counter += 1;
        foundOne = true;
      }
      else {
        if(foundOne) break;
      }
    }
    return counter;
  }

在我看来,这counter>0是一个等价的条件foundOne==true;这将允许您将代码简化为:

public int countRun( String s, char c )
  {
    int counter = 0;
    for( int i = 0; i < s.length(); i++)
    {
      if( s.charAt(i) == c )  counter++;
      else if(counter>0) break;
    }
    return counter;
  }

这种方式的逻辑有点难以遵循,因为变量名foundOne是自记录的。但根据其他帖子,“小就是美”也......

于 2013-05-31T04:43:23.367 回答
0

使用 assci 数组计数器

 public static int countRun(String s, char c) {
    int[] counts = new int[256];
    int count = 0;
    char currChar;
    for (int i = 0; i < s.length(); i++) {
        currChar = s.charAt(i);
        if (currChar == c) {// match
            counts[c]++;
        } else if (Character.isSpaceChar(currChar)) {
            counts[c] = 0;// reset counter for c
        } else {// no match
            if (counts[c] > 0) {// return accumulated counts if you have
                count = counts[c];
                return count;
            }
        }
    }
    return count;
 }
于 2017-11-04T23:50:24.210 回答
0
public class A3B2C1 {

    public static void main(String[] args) {
        String s = "AAABBC";
        
        s = s + '#';//dummy char to consider the last char 'C' in the string
        
        //without using charAt()
        int count = 1;
        String n="";
        int i=0;
        
        StringBuffer bf = new StringBuffer();
        char c[] = s.toCharArray();
        
        for(i=0;i< c.length-1;i++)
        {
            if(c[i] == c[i+1])
            {
                count++;
            } 
            else 
            {
                n = c[i] +""+count;
                bf.append(n);
                count=1;
            }
        }   
        System.out.println("Output: "+bf);//prints-->> Output: A3B2C1
    }
}
于 2020-10-28T13:46:12.070 回答