我必须打印字符串中的字数,这些字数重复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);
}
}
答案 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]越来越小。它应始终包含完整输入数字列表