【问题标题】:Javascript string conversion and array sortJavascript字符串转换和数组排序
【发布时间】:2015-11-11 23:37:36
【问题描述】:

我正在一个 JavaScript 学习网站上尝试挑战。

说明如下:

决定为数字赋予“权重”。一个重量 数字将从现在开始是其数字的总和 例如 99 将 “重量”为 18,100 的“重量”为 1,因此在列表中 100 将 在 99 之前。给定一个字符串,其中包含 FFC 成员的权重 正常顺序你可以给这个字符串按这些“权重”排序吗 数字?

示例: a = "56 65 74 100 99 68 86 180 90"按数字权重排序变为:"100 180 90 56 65 74 68 86 99" 当两个数字相同时 “重量”,让我们将它们分类为字符串而不是数字: 100 在 180 之前,因为它的“重量”(1) 小于 180 (9) 和 180 在 90 之前,具有相同的“重量” (9) 它 作为字符串出现在前面。列表中的所有数字都是正数 数字和列表可以为空。

我的尝试如下:

function orderWeight(strng) {

  console.log(strng);
  if (strng === "") {
    return strng;
  } else {
    var arr = strng.split(" ").sort();
    console.log(arr);
    var keys = [];

    for (var i = 0; i < arr.length; i++) {
      var weight = 0;
      var current = arr[i];
      //loop through the array adding the digits of each number
      for (var j = 0; j < arr[i].length; j++) {
        var sNum = parseInt(arr[i].charAt[j]);
        weight += sNum;
        console.log(weight);
      }
      keys.push({
        weight: weight,
        number: current
      });
      console.log(keys);
    }
  }
};

我的代码的输出是:

input string "103 123 4444 99 2000"
console.log(arr); = [ '103', '123', '2000', '4444', '99' ]
console.log(weight); = NaN

我意识到在这部分代码工作后我需要做更多工作,但如果有人能指出让这部分做我想做的事情的方向,我将不胜感激。

【问题讨论】:

标签: javascript arrays string sorting


【解决方案1】:

通过将每个字符串转换为整数并取数字之和来计算每个字符串的权重:

var weight = 0,
    x = parseInt(parts[i], 10);
while (x != 0) {
  var digit = x % 10;
  weight += digit;
  x = (x - digit) / 10;
}

然后制作包含每个值及其来源的字符串的对象:

sorted[i] = { weight: weight, string: parts[i] };

现在您可以 sort the objects 使用比较函数,如果权重不同则使用权重,否则使用 standard string comparison

sorted.sort(function (a, b) {
  if (a.weight != b.weight) {
    return a.weight - b.weight;
  }
  return a.string.localeCompare(b.string);
});

最后,提取字符串并打印出来显示结果。

演示:

function print(s) {
  document.write(s + '<br />');
}

function solve(s) {
  print('input: ' + s);
  var parts = s.split(' '),
      n = parts.length,
      sorted = new Array(n);
  for (var i = 0; i < n; ++i) {
    var weight = 0,
        x = parseInt(parts[i], 10);
    while (x != 0) {
      var digit = x % 10;
      weight += digit;
      x = (x - digit) / 10;
    }
    sorted[i] = { weight: weight, string: parts[i] };
  }
  sorted.sort(function (a, b) {
    if (a.weight != b.weight) {
      return a.weight - b.weight;
    }
    return a.string.localeCompare(b.string);
  });
  var newParts = new Array(n);
  for (var i = 0; i < n; ++i) {
    newParts[i] = sorted[i].string;
  }
  print('output: ' + newParts.join(' '));
}

solve("56 65 74 100 99 68 86 180 90");

【讨论】:

    【解决方案2】:

    我会创建一个函数来计算权重,然后使用 custom sort function 对数组进行排序。

    这是一个正在运行的示例。

    var input = "56 65 74 100 99 68 86 180 90";
    var a = input.split(" ");
    a.sort(function(x, y) {
      var xWeight = getWeight(x);
      var yWeight = getWeight(y);
      if (xWeight === yWeight)
        return x > y;
      else
        return xWeight > yWeight;
    });
    
    function getWeight(x) {
      var weight = 0;
      var arr = x.split("");
      arr.forEach(function(i) {
        weight += parseInt(i, 10);
      });
    }
    
    console.log(a);

    【讨论】:

      【解决方案3】:

      您在调用charAt 时使用方括号而不是圆括号。

      改变这个:

      var sNum = parseInt(arr[i].charAt[j]);
      

      到:

      var sNum = parseInt(arr[i].charAt(j));
      

      【讨论】:

        【解决方案4】:

        可以按如下方式进行:

        function getWeight(string){
          return eval(string.split('').join('+'))
        }
        
        function orderWeight(string){
          return string.split(' ').sort(function(a,b){
            var wA = getWeight(a), wB = getWeight(b);
            if(wA>wB) return 1;
            if(wA<wB) return -1;
            if(a>b)   return 1;
            if(a<b)   return -1;
            return 0;
          }).join(' ');
        }
        

        【讨论】:

          猜你喜欢
          • 2021-08-08
          • 1970-01-01
          • 1970-01-01
          • 2015-11-11
          • 1970-01-01
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          • 2020-12-23
          相关资源
          最近更新 更多