【问题标题】:Inserting into a number string插入数字字符串
【发布时间】:2014-02-28 23:29:11
【问题描述】:

让函数 DashInsert(num) 在 num 的每两个奇数之间插入破折号 ('-')。例如:如果 num 为 454793,则输出应为 4547-9-3。不要把零算作奇数。 这是我的代码(不工作)。当我运行它时,我得到与无限循环相同的响应,我必须杀死页面,但我不明白为什么。我知道有办法通过将其保留为字符串来做到这一点,但现在我想知道为什么我的方法不起作用。谢谢...

function DashInsert(num) {  
  num = num.split("");
  for (i = 1; i < num.length; i++) {
    if (num[i - 1] % 2 != 0 && num[i] % 2 != 0) {
      num.splice(i, 0, "-");
    }
  }
  num = num.join("");
  return num;
}

【问题讨论】:

  • @A1rPun 这没什么区别。
  • 确实如此,您的代码可能会导致奇怪的行为。
  • 我认为这是因为在某些情况下,您在破折号 '-' 本身上使用 % 运算符,例如在你将破折号拼接到数组之后。

标签: javascript arrays string insert


【解决方案1】:

使用num.splice,您正在向数组中插入新条目,因此增加了它的长度——这使得i的值“落后”了数组的增加长度,因此永远不会满足中断条件。

除此之外,在插入 -num[i-1] 之后的下一次迭代中,将是 - 字符,因此您实际上是在尝试检查 '-' % 2 != 0 是否......这也没什么意义。

因此,当您将 - 插入数组时,您也必须将 i 增加一 - 这将 a) 说明数组的长度增加了 1,并且它还将检查下一个数字下一次迭代的- 之后:

function DashInsert(num) {  
  num = num.split("");
  for (i = 1; i < num.length; i++) {
    if (num[i - 1] % 2 != 0 && num[i] % 2 != 0) {
      num.splice(i, 0, "-");
      i++; // <- this is the IMPORTANT part!
    }
  }
  num = num.join("");
  return num;
}

alert(DashInsert("454793"));

http://jsfiddle.net/37wA9/

【讨论】:

  • 您的函数是否仅适用于短于 20 的字符串?
  • 啊,抱歉,这只是调试措施留下的关于为什么它“无休止”运行的结果——已删除。
【解决方案2】:

一旦您插入一个破折号-if 语句就会检查这个始终为真的'-'%2 != 0,因此会无限插入另一个破折号。

这是使用正则表达式和函数的replace 的一种方法:

function DashInsert(n) {
    var f = function(m,i,s) { return m&s[i+1]&1 ? m+'-' : m; };
    return String(n).replace(/\d/g,f);
}

DashInsert(454793) // "4547-9-3"

【讨论】:

  • 这没有回答他的问题。他正在寻找代码中的问题,而不是替代解决方案。事后复制/粘贴只是抄袭:)
  • @ktm5124 嗯?什么是抄袭?将鼠标悬停在编辑时间上以查看时间戳。我的编辑时间是 23:45:04Z,而您的评论时间是 23:45:15Z,11 秒后
【解决方案3】:

当您添加破折号时,该破折号将在下一次迭代中作为数字处理。你需要前进一步。

function DashInsert(num) {  
  var num = num.split("");
  for (var i = 1; i < num.length; i++) {
    if ((num[i - 1] % 2 != 0) && (num[i] % 2 != 0)) {
      num.splice(i, 0, "-");
      i++; // This is the only thing that needs changing
    }
  }
  num = num.join("");
  return num;
}

【讨论】:

  • 再次检查,在我的电脑上仍然有效。
【解决方案4】:

这是因为在某些情况下,您在破折号 '-' 本身上使用 % 运算符,例如在你将破折号拼接到数组之后。

您可以通过使用克隆数组来纠正这种行为。

function DashInsert(num) {  
  num = num.split("");

  var clone = num.slice(0);
  var offset = 0;

  for (i = 1; i < num.length; i++) {
    if (num[i - 1] % 2 != 0 && num[i] % 2 != 0) {
      clone.splice(i + offset, 0, "-");
      offset++;
    }
  }

  return clone.join("");
}

alert(DashInsert("45739"));

输出: 45-7-3-9

演示:http://jsfiddle.net/262Bf/

【讨论】:

    【解决方案5】:

    为了补充已经给出的出色答案,我想分享一个替代实现,它不会就地修改数组:

    function DashInsert(num) {  
      var characters = num.split("");
    
      var numbers = characters.map(function(chr) {
        return parseInt(chr, 10);
      });
    
      var withDashes = numbers.reduce(function(result, current) {
        var lastNumber = result[result.length - 1];
    
        if(lastNumber == null || current % 2 === 0 || lastNumber % 2 === 0) {
          return result.concat(current);
        } else {
          return result.concat("-", current);
        }
      }, []);
    
      return withDashes.join("");
    }
    

    它更长,但恕我直言,更好地揭示了意图,并避免了原始问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      相关资源
      最近更新 更多