字符串 - 字计数器

时间:2017-11-18 07:54:28

标签: java string algorithm count

我必须打印字符串中的字数,这些字数重复N次?

示例:

一二三四有三二五。

1

输出:3

因为一,四,五只出现一次。

我的代码显示输出为1。

我的代码和逻辑有什么问题?谢谢。

import java.util.*;
public class Hello {

    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        String s=scan.nextLine(),b;
        int n=scan.nextInt();
        int c=0,f=0,i;
        String[] a=s.split(" ");
        for(i=0;i<a.length;i++)
        {
            b=a[i];
            for(int j=i+1;j<a.length;j++)
            {
             if(b.equalsIgnoreCase(a[j]))
             {
                c++;
             }

            }
            if(n==c)
            {
                f++;
            }
            else
            {
                c=0;

            }
        }
        System.out.print(f);

    }
}

2 个答案:

答案 0 :(得分:1)

我发现有三个原因导致你的结果不正确。

第一个是c 如果单词只出现一次,那么if语句if(b.equalsIgnoreCase(a[j]))将永远不会成立。这意味着c将始终等于0。 因此,您需要使用1作为c的默认值,或者您应使用以下语句检查c的值if (n == c + 1)

第二点是你应该重置c的值,即使它等于n

然后使用这个双循环:

for (i = 0; i < a.length; i++) {
   b = a[i];
   for (int j = i + 1; j < a.length; j++) {

当您搜索仅存在一次的值时,每个单词的最后一次出现也将被计算在内。 有很多方法可以解决这个问题。其中一个是使用Set<String>,只计算以前没用过的单词。

所以最后你会得到类似的东西:

int c=1,f=0,i;
String[] a=s.split(" ");
Set<String> words = new HashSet<>();
for (i = 0; i < a.length; i++) {
  b = a[i];
  if (words.add(b)) {
    for (int j = i + 1; j < a.length; j++) {
      if (b.equalsIgnoreCase(a[j])) {
        c++;
      }
    }
    if (n == c) {
      f++;
    }
    c = 1;
  }
}

答案 1 :(得分:0)

我认为这是因为当n == c时你没有初始化C语言。因此,它在一个和一个匹配后增加到1。而且效果不佳。每个循环应该为0 另外为什么j从i + 1开始?在每个循环之后,它将逐一失去比较,因为[j]越来越小。它应始终包含完整输入数字列表