我需要创建一个函数,以便返回最宽牧场的起始和结束索引以及宽度。
它需要以这个特定的顺序返回一个数组。[length, starting_index, ending_index]
例如,对于"_-___-__-____-______-_"
,返回值应为[6, 14, 19]
。
如果有多个牧场具有相同的长度,则将牧场的位置返回到数组的末尾。
例如,对于"_-___-__-___-"
,返回值应为[3, 9, 11]
。
如果最宽的牧场长度为0,例如"---"
,则对所有值[0, 0, 0]
返回0。
var widestPasture = function (landscape) {
// Implement your code below
let array = landscape.split("-");
let greatest;
let tillGreatest = 0;
let endIndex;
let answer = [];
for (let i = 0; i < array.length; i++) {
if (array[i + 1] !== undefined) {
greatest = array[i].length;
}
}
for (let i = 0; i < array.length; i++) {
if (array[i].length < greatest) {
tillGreatest += array[i].length;
}
}
let startIndex = tillGreatest += 1;
tillGreatest += 2;
endIndex = tillGreatest + greatest -1;
answer = [greatest, tillGreatest, endIndex];
return answer;
};
console.log(widestPasture("_-___-__-____-______-_"));
// -> [6, 14, 19]
console.log(widestPasture("_-___-__-___-"));
// -> [3, 9, 11]
我遇到的问题是如何输出[3, 9, 11]
。目前第二个输出是[3, 6, 8]
。感觉解决方案很简单,但我无法掌握它,我所有的其他尝试都导致了当前工作代码的破坏。
我唯一的选择是从头重写吗?
5条答案
按热度按时间mqxuamgl1#
第一个问题是变量
greatest
被设置为倒数第一个分区,而没有比较哪个分区是最长的。即使第一个分区是最长的,greatest
仍然会被下一个数组的长度覆盖--即使它更短。其次,
tillGreatest
变量获取比最大值短的数组的长度之和。但这也将包括 * 在 * 最大值之后的数组长度。另一个问题是,由于拆分,您会丢失对起始索引的跟踪。您尝试使用
+= 1
和+= 2
来克服这个问题,但这还不够通用。老实说,分割成分区使这比必要的更困难。我建议不要进行拆分,而只是迭代
landscape
字符串的每个字符,并跟踪_
的 current 系列的起始索引,并导出其长度。然后,只要得到的长度大于之前注册的长度,就可以更新答案数组。下面是它的样子:
mmvthczy2#
我打算输入Trincots关于
greatest
变量的解释,所以我不会在这里重复,他们的解决方案很棒。这里有一个替代的解决方案,这样你就可以看到不同的方法wn9m85ua3#
一个可行的方法是使用
matchAll
,它将匹配这个简单的正则表达式…/_+/g
...下划线字符序列(全局)。结果数组包含匹配项,其中每个项都具有匹配本身(下划线序列),例如
index
属性表示匹配的开始位置。sort
匹配项的数组,按照每个项的匹配长度以升序排列,将把OP的感兴趣的匹配结果作为排序数组的最后一项。从这个项目中,可以创建/组装OP正在寻找的结果数组。kwvwclae4#
为了探索实现相同功能的各种方法,我们可以使用String的Regular Expressions和matchAll方法。
/_+/g
是JavaScript中定义的正则表达式。要在JavaScript中定义正则表达式,我们以/(斜杠)字符开始和结束。然后我们在这些页岩之间写下规则。在这里,我编写了_+
来匹配至少带有一个或多个下划线的事件。在结束斜杠之后,我们可以输入一些额外的字符来定义正则表达式的标志;通过在表达式后键入g
,我们定义了一个全局表达式。全局标志允许匹配给定字符串的所有出现,否则我们将只匹配第一个出现。要使用matchAll
方法,我们需要有一个全局正则表达式。下面的代码使用了这些功能:**旁注:**要轻松测试正则表达式并了解更多有关它们的信息,您可以访问RegExr。它有一个很好的,干净的,非常有用的UI。如果你需要使用正则表达式,这个网站是必备的工具。
b1uwtaje5#
你可以在下面找到一个简单的解决方案,它通过输入字符循环,找到牧场,每当它找到一个比迄今为止最好的牧场更好的牧场时,它就会成为迄今为止最好的牧场。你可以在字里行间找到详细的解释。
这就是没有注解的解决方案的相似之处