【问题标题】:String-Word counter字符串字计数器
【发布时间】:2017-11-18 07:54:27
【问题描述】:

我必须打印一个字符串中重复 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);

    }
}

【问题讨论】:

  • 我建议使用调试器逐行执行。
  • 你永远不会重置 i 变量。

标签: java string algorithm count


【解决方案1】:

我看到了导致您的结果不正确的三个原因。

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

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

然后用这个双 for 循环:

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

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

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

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;
  }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2018-04-20
      相关资源
      最近更新 更多