我试图解决随机编码kata并找到这个,我的问题是什么是解决这个kata的最佳算法和最佳设计方法?
给定一系列数字,确定序列的类型,计算并返回下一个数字 顺序。
Integer guessNextNumber(List<Integer> sequence);
给定的序列可以是两种类型之一,算术序列和几何序列。
算术序列定义为: Arith_seq(p,q)= p,p + q,(p + q)+ q,... 示例:Arith_seq(7,3)= 7,10,13,16,19,......
几何序列定义为: Geo_seq(p,q)= p,p * q,(p * q)* q,... 示例:Geo_seq(2,3)= 2,6,18,54,......
预期的输入和输出: 输入序列至少有3个数字。 对于输入序列(7,10,13,16,19),返回值为22。 对于输入序列(2,6,18,54),返回值将为162。
算法:
如果序列(b-a)或(c-b)的元素之间的差异是 等于它的算术序列。
如果序列元素之间的划分相等,例如:b / a和 c / b然后是几何序列
我的问题是解决它的最佳算法是什么?
更新:是否可以解决这个恒定的运行时间?
答案 0 :(得分:1)
假设您的收藏品是a,b,c,d
b - a + b = c
然后是算术b / a * b = c
它是几何要返回正确的序列,您可以这样做
Java将是(假设它是artihmetic或几何,从来没有任何其他东西,并且总是至少有3个条目)
public int nextInt(int[] s){
if( s[1] - s[0] == s[2] - s[1] ) return ( s[1] - s[0] ) + s[s.length - 1];
return ( s[1] / s[0] ) * s[s.length - 1];
}
安全代码
public int nextInt(int[] s){
if(s!=null && s.length > 3){
if( s[1] - s[0] == s[2] - s[1] ) return ( s[1] - s[0] ) + s[s.length - 1];
if( s[1] / s[0] == s[2] / s[1] ) return ( s[1] / s[0] ) * s[s.length - 1];
}
return -1;
}
使用List而不是Array
public Integer guessNextNumber(List<Integer> sequence){
if( sequence.get(1) - sequence.get(0) == sequence.get(2) - sequence.get(1) ) return ( sequence.get(1) - sequence.get(0) ) + sequence.get(sequence.size() - 1);
return ( sequence.get(1) / sequence.get(0) ) * sequence.get(sequence.size() - 1);
}
答案 1 :(得分:0)
现在的问题很简单:找出序列的前三个数字之间的差异并进行比较。如果它们相等,则序列是算术的。如果不是,则序列是几何的。
考虑算术序列5,2。
5,7,9,11,13,15。
考虑几何序列5,2。
5,10,20,40.
第一个序列中数字之间的差异:2。第二个序列中数字之间的差异:5,10,20。
一旦确定序列是几何还是算术,只需使用差值来预测算术序列中的下一个数字,或者将序列中的第二个数字除以第一个数字,然后将最后一个数字乘以商,以便找到下一个数字。
def determineProgression(xs: List[Int]): String = {
assert(xs.length >= 3, "The list must be at least three elements long.")
if ((xs(1) - xs(0)) == (xs(2) - xs(1)))
"This is an arithmetic sequence. The most likely next step is " + (xs.last + (xs(1) - xs(0)))
else if ((xs(1) / xs(0)) == (xs(2) / xs(1)))
"This is a geometric sequence. The most likely next step is " + (xs.last * (xs(2) / xs(1)))
else "This sequence is neither arithmetic nor geometric."
}