ArithGeo(arr)CoderByte Ruby:为什么这个解决方案不能用于某些测试用例场景

时间:2015-09-02 15:13:34

标签: ruby-on-rails arrays ruby

下面我发布了此问题的说明以及我的解决方案。一些测试用例场景失败了,但似乎最适用。任何人可以帮助我出错了吗?非常感谢任何帮助!!

  • 使用Ruby语言,让函数ArithGeo(arr)获取存储在arr中的数字数组,如果序列遵循算术模式则返回字符串“Arithmetic”,如果它遵循几何,则返回“Geometric”图案。

  • 如果序列不遵循任何一种模式,则返回-1。

  • 算术序列是每个数字之间的差异一致的算法序列

  • 算术示例:[2,4,6,8]

  • 在几何序列中,第一个之后的每个术语乘以某个常数或公共比率。

  • 几何例子:[2,6,18,54]

  • 可以输入负数作为参数,不输入0,并且没有数组包含所有相同的元素。

代码:

def arithGeo(num)

  idx = 0
  while idx < num.length

    if ((num[idx] - num[idx + 1]) == (num[idx + 1] - num[idx + 2]))
      return "Arithmetic"
    elsif ((num[idx + 1] / num[idx]) == (num[idx + 2] / num[idx + 1]))
      return "Geometric"
    else
      return "-1"
    end

  idx += 1
  end

end

 #Test Cases that Failed

 p arithGeo([1, 2, 3, 4, 5, 10, 20])

 p arithGeo([1, 2, 3, 4, 5, 6, 7, 88, 2])

 p arithGeo([10, 110, 210, 310, 410, 511])

4 个答案:

答案 0 :(得分:0)

好的,让我们做更多&#34; ruby​​ like&#34;方式:

def arith?(arr)
  check_arr = []
  arr.reverse.inject {|memo, num| check_arr << (memo - num); num}
    #loop through from highest to lowest, subtracting each from the next and store in check_arr
  check_arr.all? {|num| num == check_arr[-1]}
    #check that all results are the same in the arr i.e. [2,2,2,2,2]
end

如果所有操作返回相同的结果,则返回true,因此是线性进展。

def geo?(arr)
  check_arr = []
  arr.reverse.inject {|memo, num| check_arr << (memo / num); num}
    #loop through from highest to lowest, dividing each by the next and store in check_arr
  check_arr.all? {|x| x == check_arr[-1]}
    #check that all products are the same in the arr i.e. [3,3,3,3,3]
end

如果所有操作都返回相同的结果,则返回true,即几何级数。

现在在其他方法中使用这些方法

def arith_geo?(arr)

  if arith?(arr)
    'Arithmetic' 
  elsif geo?(arr)
     'Geometric'
  else
    -1
  end

end

答案 1 :(得分:0)

你确实使用了while但是你没有循环数据,因为你写return你只会看到前三个数字,然后立即返回结果。您必须保留以前的结果,并确保结果保持不变,以返回几何或算术。

这应该可以帮助你完成练习:)

答案 2 :(得分:0)

我能够用JavaScript完成解决方案,这就是我想出的:

function algoGeo(arr){
    var algo = true;
    var geo = true;
    //first check algo
    for(var k = 1; k < arr.length; k++){
        if( (arr[0] + (arr[1] - arr[0]) * k) !== arr[k] && algo ){
            algo = false;
        }
        if( arr[0] * Math.pow(arr[1] / arr[0], k) !== arr[k] && geo){
            geo = false;
        }
    }
    return algo ? "Arithmetic" : geo ? "Geometric" : -1; 
}

var arr = [5,12,19,26];
console.log(algoGeo(arr));

答案 3 :(得分:0)

def ArithGeo(arr)
  diff1 = []
  diff2 = []
  arr.each_index do |x|
    if(x + 1 < arr.length)
      diff1 << arr[x + 1] - arr[x]
      diff2 << arr[x + 1] / arr[x]
     end
    end
  diff1.uniq.size == 1 ? "Arithmetic" : diff2.uniq.size == 1 ? "Geometric" : -1
end

有点晚了,但这是我在尝试解决同样问题时提出的问题。