下面我发布了此问题的说明以及我的解决方案。一些测试用例场景失败了,但似乎最适用。任何人可以帮助我出错了吗?非常感谢任何帮助!!
使用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])
答案 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
有点晚了,但这是我在尝试解决同样问题时提出的问题。