【发布时间】:2018-05-20 09:35:50
【问题描述】:
我有一个数组数组。在每个子数组中,如果两个或多个元素共享一个长度等于或大于八的前缀,那么我想用它们的最长前缀替换这些元素。对于这个数组:
m = [
["A", "97455589955", "97455589920", "97455589921"],
["B", "2348045101518", "2348090001559"]
]
我希望得到这样的输出:
n = [
["A", "974555899"],
["B", "2348045101518", "2348090001559"]
]
对于m 中的第一个子数组,最长前缀是长度为9 的"974555899"。
974555899-55
974555899-20
974555899-21
对于第二个子数组,最长的前缀是"23480",长度为 5,小于 8。在这种情况下,第二个子数组保持原样。
23480-45101518
23480-90001559
对于这个输入:
m = [
["A", "2491250873330", "249111222333", "2491250872214", "2491250872213"],
["B", "221709900000"],
["C", "6590247968", "6590247969", "6598540040", "65985400217"]
]
输出应该是这样的:
[
["A", "2491250873330", "249111222333", "249125087221"],
["B", "221709900000"],
["C", "659024796", "65985400"]
]
对于array m[0],它的四个数字之间没有足够长的前缀,但在m[0][2] 和m[0][3] 之间有一个长度为12 的前缀249125087221。对于array m[2],在m[2][0] 和m[2][1] 之间有一个长度为9 的前缀"659024796",在m[2][2] 和m[2][3] 之间还有一个长度为8 的前缀"65985400"。
我构造了下面的代码:
m.map{|x, *y|
[x, y.map{|z| z[0..7]}.uniq].flatten
}
使用带有第一个输入的代码,我得到了这个输出。
[
["A", "97455589"],
["B", "23480451", "23480900"]
]
我不知道如何在不设置固定长度的情况下动态获取公共前缀。
【问题讨论】:
-
其实LCM代表Least common multiple。最大公数是什么意思?数字应该以给定的数字开头还是只包含它?
-
我发明了首字母缩写词 LCN jeje。我的意思是第一个数字相等但大小最大的数字。在 12345 和 1234567 之间,最大的常见数字是 12345,长度 = 5。
-
你想要的输出的最后一个元素不应该是
["C","659024796","6598540040", ,"65985400217"]]吗?我想你可能数错了 8 而不是 9。 -
嗨,卡里。不。我已经更新了我的帖子
UPDATE 2,以解释第三个子数组的输出。 -
我认为标准是
> 8而不是>= 8。我会修正我的答案。