开发者问题收集

给定一个数组,找到两个最短的字符串,提取它们并将它们附加到末尾,直到只剩下一个字符串

2017-10-08
140

我被一个编码挑战难住了两个小时,需要帮助。完整说明如下:

给定一个字符串数组,按如下方式生成一个字符串:

当数组中有多个字符串时,重复以下步骤:

在数组中找到最短的字符串(如果有几个相同长度的字符串,则取最左边的字符串);

在其余字符串中找到最短的字符串(如果有几个相同长度的字符串,则取最右边的字符串);

从数组中提取选定的字符串;

将它们连接的结果(第二个字符串应添加到第一个字符串的末尾)附加到数组的右端。

算法完成后,数组中将剩下一个字符串。返回该字符串。

我尝试解决

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)
  }
}
3个回答

此条件使循环无限:

while (init.length > 0) {

您需要在数组中只剩下 1 个元素时停止, 因此将 0 更改为 1。

您还遇到了一个错误。 您需要在每次迭代结束时更新 shortestStringshorterString 的值, 否则它们可能会保留其过时的值。 例如,在示例输入 ["thinking", "whatface", "cantare", "wait", "jay", "cutler"] 中,它们将保持设置为 jaywait , 永远不会改变, 并导致输出不正确。

并且您可能希望在函数结束时 return init[0]

janos
2017-10-08

这里有一个完整的工作模型。每次你都可以看到数组是如何变化的!运行它。 这个想法很简单,找到 shortestshorter 元素,删除它们,并附加 appended 字符串。重复此操作,直到数组的长度大于 1

顺便说一句,如果你想要这个值,那么当然要用 console.logreturn 替换 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);
Miraj50
2017-10-08

运行程序后,我想我找到了你的问题。第一次通过数组时,你正确地设置了 shortestStringshorterString ,但在第二次之前没有重置它们。这导致程序无法找到更短或相等长度的字符串并崩溃。但是,像你现在所做的那样重置会导致类似的问题:如果第一个字符串是最短的,则会返回最短和最短的字符串(因为它在被删除之前保存在 shorterString 中)。要解决这个问题,只需存储每个字符串的长度,这样你就可以将它们都初始化为 Number.MAX_SAFE_INTEGER (或者我猜 Infinity 也可以)。停止 while 循环的条件是 init.length > 0 而不是 > 1 。您有几个任务(即 newArraynewInit )是毫无意义且未使用的。无论如何,在从头开始编写函数后,我得到了以下内容:

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]
}
Matthias
2017-10-08