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