Java 如何确定一串单词是否属于斐波那契模式

Java 如何确定一串单词是否属于斐波那契模式,java,string,logic,fibonacci,Java,String,Logic,Fibonacci,问题:验证作为输入的字符串、单词的长度是否属于斐波那契模式,即单词的长度是前面两个单词长度的总和 一个单词只由字母组成。例如,拉!hul是两个单词,由!分隔 输入可以有任意数量的单词。所有输入必须至少有3个字。 例如,我是,罗恩是按照模式的(I,AM,RON),而是她的!E(是,它,她的,E)不是,因为第四个元素的长度应该是6 输出应该是这样的:如果输入的所有单词都属于斐波那契模式,那么在检查完所有单词后,最后应该输出YES,如果输入的任何部分都不属于斐波那契模式,那么应该输出NO,而不需要进一

问题:验证作为输入的字符串、单词的长度是否属于斐波那契模式,即单词的长度是前面两个单词长度的总和

一个单词只由字母组成。例如,拉!hul是两个单词,由!分隔

输入可以有任意数量的单词。所有输入必须至少有3个字。 例如,
我是,罗恩
是按照模式的(
I
AM
RON
),而
是她的!E
她的
E
)不是,因为第四个元素的长度应该是6

输出应该是这样的:如果输入的所有单词都属于斐波那契模式,那么在检查完所有单词后,最后应该输出
YES
,如果输入的任何部分都不属于斐波那契模式,那么应该输出
NO
,而不需要进一步评估运行是否结束

我的问题:我确实写了一段代码,它总是以“否”的形式输出,我不知道我的逻辑哪里出了问题,但我觉得我在切换循环后出错了,请修改/建议,其他更好的方法太受欢迎了。这是我的密码:

public class Holla {
      static int j=-1,a,b,c;
       public static void main(String[] args) {
               Scanner s = new Scanner(System.in);
            String h=s.nextLine();
            int i=0,x=0;
            while(i<h.length())
            {
                if(Character.isLetter(h.charAt(i)))
                     x++;
                else
                {
                    while(x>0)
               out: {
                       j++;
                        switch (j) 
                        {
                            case 0:
                                a=x;
                                break;
                            case 1:
                                b=x;
                                break;
                            default:
                                c=x;
                        }
                        if((j==0)||(j==1))
                              break out;
                            if (c==(a+b))
                                {
                                   a=b;
                                    b=c;
                                    j=1;
                                }
                                else
                                {
                                    System.out.println("NO");
                                    System.exit(0);
                                }
                    }
                    x=0;
                }
                i++;
            }
           System.out.println("YES");
        }
    }
公共类Holla{
静态int j=-1,a,b,c;
公共静态void main(字符串[]args){
扫描仪s=新的扫描仪(System.in);
字符串h=s.nextLine();
int i=0,x=0;
while(i0)
输出:{
j++;
开关(j)
{
案例0:
a=x;
打破
案例1:
b=x;
打破
违约:
c=x;
}
如果((j==0)| |(j==1))
爆发
如果(c==(a+b))
{
a=b;
b=c;
j=1;
}
其他的
{
系统输出打印项次(“否”);
系统出口(0);
}
}
x=0;
}
i++;
}
System.out.println(“是”);
}
}

您可以更多地使用Java标准库

首先,假设您有输入:
字符串输入

为了让生活更轻松,让我们将其拆分为元素词列表,每个元素词之间用与普通字母不同的字母分隔:

String pattern = "^[a-zA-Z]";
String tokens[] = input.split(pattern);
Predicate<String> filterNonEmpty = a -> !a.isEmpty();
List<String> words =
    Arrays.asList(tokens).stream().filter(filterNonEmpty).collect(Collectors.toList());
String pattern=“^[a-zA-Z]”;
字符串标记[]=input.split(模式);
谓词过滤器nonempty=a->!a、 isEmpty();
单字=
Arrays.asList(tokens).stream().filter(filterOnEmpty).collect(Collectors.toList());
好了,现在我们有了单词,现在是时候运行“斐波那契检测器”(也就是说,我们检查每个单词的长度是否等于前面两个单词的长度之和):

if(words.size()<3){..}//处理问题中指定的边缘大小写
//抓取第一个和第二个单词的长度
int len1=words.get(0.length();
int len2=words.get(1.length();
//现在迭代剩余的单词
for(int i=2;i
顺便说一句。
请注意,对于长度为:
1,3,4,7,11
的单词,此代码将返回
true
:什么不是斐波那契序列(因为起始元素不是
0&1
/
1&1
)。

我否决了此问题,因为没有证据表明对此代码执行了任何调试。请您的问题向我们展示您的调试发现了什么,以及关于特定代码行的特定问题。请参阅:和。“我觉得我把问题的细节写得太冗长了,所以如果您希望能够编辑并使其尽可能简洁”您真的只是写了一个问题,并要求我们改进您自己的问题吗?更明确地解释您的问题与调试不一样。您应该能够指出不超过五行的代码,并解释为什么这五行代码没有达到您期望的效果。在你这么做之前,我不会取消我的否决票。
if (words.size() < 3) { .... } // handle edge case specified in question

// grab lengths of first & second word
int len1 = words.get(0).length();
int len2 = words.get(1).length();

// now iterate over remaining words
for (int i = 2; i < words.size; ++i) {
    String newWord = words.get(i);
    int newLen = newWord.length();
    if (newLen != len1 + len2) {
        // word at index [i] does not have "Fibonacci size"
        return false;
    } else {
        // everything good, we need to move the lengths
        len1 = len2;
        len2 = newLen;
    }
}
// all the words had "Fibonacci size"
return true;