给定一个数组,找到两个最短的字符串,提取它们并将它们附加到末尾,直到只剩下一个字符串
我被一个编码挑战难住了两个小时,需要帮助。完整说明如下:
给定一个字符串数组,按如下方式生成一个字符串:
当数组中有多个字符串时,重复以下步骤:
在数组中找到最短的字符串(如果有几个相同长度的字符串,则取最左边的字符串);
在其余字符串中找到最短的字符串(如果有几个相同长度的字符串,则取最右边的字符串);
从数组中提取选定的字符串;
将它们连接的结果(第二个字符串应添加到第一个字符串的末尾)附加到数组的右端。
算法完成后,数组中将剩下一个字符串。返回该字符串。
我尝试解决
function concatenationProcess(init) {
var shortestString = init[0];
var shorterString = init[0];
var appendedString = "";
while (init.length > 0) {
for (i = init.length - 1; i >= 0; i--) {
if (init[i].length <= shortestString.length) {
shortestString = init[i];
}
}
var newArray = init;
newArray = init.splice(init.indexOf(shortestString), 1)
for (i = 0; i < init.length; i++) {
if (init[i].length <= shorterString.length) {
shorterString = init[i];
}
}
init.splice(init.indexOf(shorterString), 1)
var newInit = init;
console.log(shorterString, "shorter string")
appendedString = shortestString + shorterString
init.push(appendedString)
console.log(init)
}
}
此条件使循环无限:
while (init.length > 0) {
您需要在数组中只剩下 1 个元素时停止, 因此将 0 更改为 1。
您还遇到了一个错误。
您需要在每次迭代结束时更新
shortestString
和
shorterString
的值,
否则它们可能会保留其过时的值。
例如,在示例输入
["thinking", "whatface", "cantare", "wait", "jay", "cutler"]
中,它们将保持设置为
jay
和
wait
,
永远不会改变,
并导致输出不正确。
并且您可能希望在函数结束时
return init[0]
。
这里有一个完整的工作模型。每次你都可以看到数组是如何变化的!运行它。
这个想法很简单,找到
shortest
和
shorter
元素,删除它们,并附加
appended
字符串。重复此操作,直到数组的长度大于
1
。
顺便说一句,如果你想要这个值,那么当然要用
console.log
或
return
替换
alert
。
function concatenationProcess(init) {
while(init.length>1){
var shortest = init[0];
var appended = "";
var p=0; // for storing the position of shortest/shorter
for (i = init.length - 1; i >= 0; i--) {// find shortest
if (init[i].length <= shortest.length) {
shortest = init[i];
p=i;
}
}
init.splice(p,1); // remove shortest
var shorter= init[0];
for (i = 0; i <init.length; i++) { // find shorter
if (init[i].length <= shorter.length) {
shorter = init[i];
p=i;
}
}
init.splice(p,1); // remove shorter
appended = shortest+shorter;
init.push(appended); //append the appended string
alert(init);
}
}
var x = [ "thinking", "whatface", "cantare", "wait", "jay", "cutler"];
concatenationProcess(x);
运行程序后,我想我找到了你的问题。第一次通过数组时,你正确地设置了
shortestString
和
shorterString
,但在第二次之前没有重置它们。这导致程序无法找到更短或相等长度的字符串并崩溃。但是,像你现在所做的那样重置会导致类似的问题:如果第一个字符串是最短的,则会返回最短和最短的字符串(因为它在被删除之前保存在
shorterString
中)。要解决这个问题,只需存储每个字符串的长度,这样你就可以将它们都初始化为
Number.MAX_SAFE_INTEGER
(或者我猜
Infinity
也可以)。停止
while
循环的条件是
init.length > 0
而不是
> 1
。您有几个任务(即
newArray
和
newInit
)是毫无意义且未使用的。无论如何,在从头开始编写函数后,我得到了以下内容:
function concatenationProcess (init) {
var shortestLength;
while (init.length > 1) {
shortestLength = Number.MAX_SAFE_INTEGER;
var shortestString;
for (var i = init.length-1; i >= 0; i--) {
if (init[i].length <= shortestLength) {
shortestString = init[i];
}
}
init.splice(init.indexOf(shortestString), 1);
shortestLength = Number.MAX_SAFE_INTEGER;
var shorterString;
for (var i = 0; i < init.length; i++) {
if (init[i].length <= shortestLength) {
shorterString = init[i];
}
}
init.splice(init.indexOf(shorterString), 1);
init.push(shortestString + shorterString);
}
return init[0]
}