首页 > 解决方案 > 为什么不通过代码战中问题平衡数字的所有测试用例?

问题描述

目前我正在对平衡数字的代码战进行挑战,我在 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';
  }
}

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

在此处输入图像描述

标签: algorithmdartcodewarrior

解决方案


您的问题与“长数字”无关,因为您对使用数字的测试用例进行编码也失败了13

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

  • 如果数字有奇数位,则只有一个中间数字,例如 92645 的中间数字为 6;否则,有两个中间数字,例如 1301 有中间数字 3 和 0

  • 在确定一个数是否平衡时,不应考虑中间数字,例如 413023 是一个平衡数,因为左和右和都是 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';
  }
}

推荐阅读