递归算法求解旋转滑块数组偏移量匹配参考数组值问题
首先很抱歉我暂时想不到更合适的名称来描述这个练习题/问题。
我已经完成了基础解法,但我认为方案还有很大的优化空间,各位技术爱好者能力出众且热爱挑战,肯定能给出比我的实现更优的方案。
具体问题
给定任意长度的整数数组 valuesToMatch,示例如下:
const valuesToMatch = [-1, -1, 4, -1, 4]
另有二维整数数组 rotatingSliders,其内部所有子数组长度相同,且每个子数组长度大于等于 valuesToMatch 的长度,示例如下:
const rotatingSliders = [ [0, 0, 0, 1, 0, 3], [0, 3, 0, 1, 0, 0] ]
需求目标
为 rotatingSliders 中的每一个子数组找到正确的索引偏移量,使得所有子数组对齐后,相同索引位置的元素之和等于 valuesToMatch 对应位置的数值。
valuesToMatch 中的-1代表不需要校验该位置的匹配结果。
最终返回二维结果数组 offsets,包含所有符合要求的偏移量组合,无符合条件的结果则返回空数组。
以上述数组为例,唯一正确的解为:
offsets = [ [-1, 1] ]
对齐逻辑说明
要对齐以下三个数组:
[-1, -1, 4, -1, 4] [ 0, 0, 0, 1, 0, 3] [ 0, 3, 0, 1, 0, 0]
需要将 rotatingSliders 的第一个子数组偏移-1,第二个子数组偏移+1:
| | [-1, -1, 4, -1, 4] [ 0, 0, 0, 1, 0, 3] // offset -1 [ 0, 3, 0, 1, 0, 0] // offset +1
此时可验证匹配关系:
valuesToMatch[3] == 4 && valuesToMatch[5] == 4 rotatingSliders[0][3] + rotatingSliders[1][1] = 1 + 3 = 4 rotatingSliders[0][5] + rotatingSliders[1][3] = 3 + 1 = 4
注意:rotatingSliders 中的子数组为循环旋转,偏移后超出数组边界的元素会从数组另一端移入。
offset -1代表数组整体左移1位 [ 0, 0, 0, 1, 0, 3] // 原数组 [ 0, 0, 1, 0, 3, 0] // 偏移-1后 偏移+1代表数组整体右移1位 [ 0, 3, 0, 1, 0, 0] // 原数组 [ 0, 0, 3, 0, 1, 0] // 偏移+1后
规则说明
rotatingSliders 所有子数组长度 >= valuesToMatch 长度
该规则是为了确保所有旋转后的滑块子数组始终有元素与 valuesToMatch 对齐。
希望大家能享受这个小挑战:)
内容的提问来源于stack exchange,提问作者renscrab
相关产品推荐
相关产品推荐

