【发布时间】:2018-01-24 18:20:38
【问题描述】:
鉴于下面的整数数组(列表),我希望提取每个整数,如果三个或更多整数连续上升,我想用“-”替换中间整数来表示一个范围。然后最后将值作为字符串返回。
例如,列表中的前 7 个整数:-6, -3, -2, -1, 0, 1, 3
会变成'-6,-3-1,3'
因为从-3到1的连续整数不止三个。
最终,solution(list) 应该返回以下字符串:"-6,-3-1,3-5,7-11,14,15,17-20"
以其当前形式返回以下字符串:"-6,-3,-2,-1,0,1,3,4,5,7,8,9,10,11,14,15,17,18,19,20"
也就是简单的将数组转换成字符串。
var list = [-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20];
solution(list);
function solution(list) {
final = [];
range = [];
while (list.length > 0) {
take = list.splice(0,1);
range.push(take);
n = 1;
while (take+n === list[0]) {
a = list.splice(0,1);
range.push(a);
n++;
}
if (range.length >= 3) {
min = Math.min(range).toString();
max = Math.max(range).toString();
final.push(min + "-" + max);
range.length = 0;
} else if (range.length === 2) {
final.push(range[0].toString());
final.push(range[1].toString());
range.length = 0;
} else if (range.length === 1) {
final.push(range[0].toString());
range.length = 0;
}
}
return final.join(",");
}
但是,我能够在 Ruby 中成功获得所需的结果:
list = [-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20]
def solution(list)
final = []
range = []
while (list.length > 0) do
take = list.shift
range << take
n = 1
while (take+n == list[0]) do
a = list.slice!(0)
range << a
n +=1
end
if (range.length >= 3)
final << (range.min.to_s + "-" + range.max.to_s)
range = []
elsif (range.length == 2)
final << range[0]
final << range[1]
range = []
elsif (range.length == 1)
final << range[0].to_s
range = []
end
end
return final.join(",")
end
我在 Ruby 中的方法与我的 JavaScript 几乎相同。所以,如果我想知道是否有人可以:
1) 解释为什么这种方法适用于 Ruby,但不适用于 Javascript。即使这是我的一个简单的语法错误,请随时通知我。
2) 我如何才能在 JavaScript 中提取整数并返回正确的范围?
非常感谢您的帮助!谢谢!
【问题讨论】:
-
您可以使用 Chrome 开发工具中的断点/跟踪来跟踪程序运行时的每个步骤/变量。
-
-3, -2, -1会返回什么?-3--1之类的东西? -
@sagarpandya82:是的。始终按升序排列。
-
@Stefan:我还没有测试过唯一的负整数范围。但我不得不说,是的,那将是理想的。
-
Ruby 解决方案不必啰嗦:
list.chunk_while { |b,a| a == b + 1 }.map { |a| a.length >= 3 ? [ a[0], a[-1] ].join('-') : a }.join(',')工作正常。
标签: javascript arrays ruby