如果数字=== 0,我该如何跳过?

时间:2018-04-12 19:14:53

标签: javascript algorithm

将数字转换为罗马数字时,我需要第一个数字" 2000"比所提供的数组大,添加数组的最大值,直到2000年为止。

在完成2000的数字输出后,我遇到了一个问题。它转到数组中的下一个数字,这是零! [2000,0,80,4]

如果它为零,我需要跳过。我尝试了一个finalnum [i]!= 0。



for (i = 0; i < finalnum.length; i++) {

  var idx = romanNum.indexOf(finalnum[i]);

  if (idx === -1 && finalnum[i] != 0) {
    var max = romanNum.reduce(function(a, b) {
      return (Math.max(a, b));
    });
    var amountoftimes = finalnum[i] / max;
    idx = romanNum.indexOf(max);
    romans.push(romanEquiv[idx].repeat(amountoftimes));
  } //end of if statement


}

}
&#13;
&#13;
&#13;

&#13;
&#13;
var romanNum = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000];
var romanEquiv = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', 'M'];



function convertToRoman(num) {

  //convert num to separate numbers
  var indices = [];
  var romans = [];

  //split out the number first
  var nextint = num.toString().split("");
  var nextarr = [];
  for (var i = 0; i < nextint.length; i++) {
    var firstnum = "0".repeat(nextint.length - i - 1);
    nextarr.push(nextint[i] + firstnum);
    var finalnum = nextarr.map(Number);
  }

  //find the romannumerals
  for (i = 0; i < finalnum.length; i++) {

    var idx = romanNum.indexOf(finalnum[i]);

    if (idx === -1 && finalnum[i] != 0) {
      var max = romanNum.reduce(function(a, b) {
        return (Math.max(a, b));
      });
      var amountoftimes = finalnum[i] / max;
      idx = romanNum.indexOf(max);
      romans.push(romanEquiv[idx].repeat(amountoftimes));
    } //end of if statement
  }

  return romans.join('');
}

console.log(convertToRoman(2084));
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

测试finalnum[i] == 0,并使用continue;跳到下一个号码。

但是,其余代码似乎无法正常工作。它仍然只返回"MM"。您的算法还存在其他问题

您还应该在函数中使用return。在呼叫者中执行console.log()

BTW,reduce循环可以替换为:

var max = Math.max.apply(Math, romanNum);

我不确定你为什么需要这个变量,而且每次循环时你都不需要计算它,因为romanNum数组永远不会改变。它似乎是你困惑的算法的一部分。关于转换为罗马数字的SO(以及Code Review)还有很多其他问题,你可以看看它们。

&#13;
&#13;
var romanNum = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000];
var romanEquiv = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', 'M'];

function convertToRoman(num) {

  //convert num to separate numbers
  var indices = [];
  var romans = [];

  //split out the number first
  var nextint = num.toString().split("");
  var nextarr = [];
  for (var i = 0; i < nextint.length; i++) {
    var firstnum = "0".repeat(nextint.length - i - 1);
    nextarr.push(nextint[i] + firstnum);
    var finalnum = nextarr.map(Number);
  }

  //find the romannumerals
  for (i = 0; i < finalnum.length; i++) {
    if (finalnum[i] == 0) { // skip zeroes
      continue;
    }
    var idx = romanNum.indexOf(finalnum[i]);

    if (idx === -1 && finalnum[i] != 0) {
      var max = romanNum.reduce(function(a, b) {
        return (Math.max(a, b));
      });
      var amountoftimes = finalnum[i] / max;
      idx = romanNum.indexOf(max);
      romans.push(romanEquiv[idx].repeat(amountoftimes));
    } //end of if statement
  }
  
  return romans.join('');
}

console.log(convertToRoman(2084));
&#13;
&#13;
&#13;