为什么不通过代码战中问题平衡数的所有测试用例?

why not pass all test case in problem balanced numbers in codewars?

目前我正在平衡数字的代码战中挑战,我用 dart 编写了代码,它成功完成了 100 个测试用例,但是对于长数字它不能正常工作......所以我认为它需要一些条件对于这么长的数字:

String balancedNum(numb) {
  // your code here
  var numb1 = numb.toString();
  List a = numb1.split("");

  var left_sum = 0;
  var right_sum = 0;

  for (var i = 0; i <= a.length / 2; i++) {
    left_sum += int.parse(a[i]);
  }

  List<String> b = a.reversed.toList();

  //print(b);

  for (var i = 0; i < b.length / 2; i++) {
    right_sum += int.parse(b[i]);
  }

  //print(right_sum);

  if (left_sum == right_sum) {
    return 'Balanced';
  } else {
    return 'Not Balanced';
  }
}

link来挑战:https://www.codewars.com/kata/balanced-number-special-numbers-series-number-1/train/dart

您的问题与“长数字”无关,因为您使用数字 13.

编写的测试用例代码也失败了

您没有正确阅读以下规则:

  • If the number has an odd number of digits then there is only one middle digit, e.g. 92645 has middle digit 6; otherwise, there are two middle digits , e.g. 1301 has middle digits 3 and 0

  • The middle digit(s) should not be considered when determining whether a number is balanced or not, e.g 413023 is a balanced number because the left sum and right sum are both 5.

所以你需要测试数字是偶数还是奇数,因为我们需要使用该信息来知道我们应该在每边的总和中使用多少位数。

我在下面的实现中做到了:

String balancedNum(int numb) {
  final numb1 = numb.toString();
  final a = numb1.split("");
  var split = (a.length / 2).floor();
  
  if (a.length % 2 == 0) {
    split--; // the number is even
  }

  var left_sum = 0;
  var right_sum = 0;

  for (var i = 0; i < split; i++) {
    print(a[i]);
    left_sum += int.parse(a[i]);
  }

  final b = a.reversed.toList();

  for (var i = 0; i < split; i++) {
    right_sum += int.parse(b[i]);
  }

  if (left_sum == right_sum) {
    return 'Balanced';
  } else {
    return 'Not Balanced';
  }
}

由于一个简单的逻辑错误,编译器对代码的判断是错误的答案。

这是因为列表长度没有计算正确

请看下面更正后的代码,它通过了平台上的所有110测试:

String balancedNum(numb) {
      // your code here
      var numb1 = numb.toString();
      List a = numb1.split("");

      var left_sum = 0;
      var right_sum = 0;

      double d = ((a.length-1) / 2);
      int len = d.floor();

      print(len);

      for (var i = 0; i < len; i++) {
            left_sum += int.parse(a[i]);
      }

      List<String> b = a.reversed.toList();

      print(b);

      for (var i = 0; i < len; i++) {
            right_sum += int.parse(b[i]);
      }

      print(left_sum);
      print(right_sum);

      if (left_sum == right_sum) {
                return 'Balanced';
      } else {
                return 'Not Balanced';
      }
}