编码Kata:解决这个问题的最佳算法是什么

时间:2011-09-07 02:30:15

标签: java algorithm big-o

我试图解决随机编码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。

算法:

  1. 检查输入顺序 如果我们有序列为(a,b,c)那么,
  2. 如果序列(b-a)或(c-b)的元素之间的差异是 等于它的算术序列。

  3. 如果序列元素之间的划分相等,例如:b / a和     c / b然后是几何序列

  4. 我的问题是解决它的最佳算法是什么?

    更新:是否可以解决这个恒定的运行时间?

2 个答案:

答案 0 :(得分:1)

假设您的收藏品是a,b,c,d

  • b - a + b = c然后是算术
  • b / a * b = c它是几何

要返回正确的序列,您可以这样做

  • d - c + d = e,如果e - d = d - c则返回e
  • else
  • d / c * d = e,如果e / d = d / c则返回e

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."
}