【问题标题】:Find the sum of an int array - leaving out all numbers between a 6 and a 7, inclusive查找 int 数组的总和 - 忽略 6 和 7 之间的所有数字(包括 6 和 7)
【发布时间】:2018-06-30 08:26:25
【问题描述】:

我想编写一个程序,将整数数组中的所有数字相加 - 有一个例外!由于数字 6 不是最好的,我建议我们排除所有以 6 开头并以 7 结尾的数字部分 - 包括在内。 每 6 后面总是跟着一个 7,但不一定反之亦然。

以下是输入数组及其预期输出的几个示例:

sum67([1, 2, 2, 6, 99, 99, 7]) = 5 6 到 7 之间的所有数字都被排除在外。

sum67([1, 2, 2]) = 5 这里没有 6 或 7。

sum67([1, 1, 6, 7, 2]) → 4 6 和 7 都不包括在内。

以上所有测试都通过了。

再一次,方法头是固定的,我可能只改变方法的主体。这是我对代码的尝试:

public int sum67(int[] nums) {
  int sum = 0;
  for (int i = 0; i < nums.length; i++) {
    // Adding all numbers that are not a 6
    if (nums[i] != 6) sum += nums[i];
  }
  for (int j = 0; j < nums.length; j++) {
    // check for the sixes - the lower bound exclusive
    if (nums[j] == 6) {
      for (int k = j + 1; k < nums.length; k++) {
        // check for the sevens - the upper bound inclusive
        if (nums[k] == 7) {
          // take away all the numbers between the 2 bounds, including the 7
          for (int m = j + 1; m <= k; m++) {
            sum -= nums[m];
          }
        }
      }
    }
  }
  return sum;
}

上面的程序不仅不起作用,而且显然非常混乱。特别是,它未通过以下测试:

sum67([1, 6, 2, 6, 2, 7, 1, 6, 99, 99, 7]) = 2实际输出为-463

sum67([2, 2, 6, 7, 7]) = 11 实际输出为-3

所以本质上:

我的代码中的错误行在哪里?

有没有更好的方法来编写这个没有那么多循环和嵌套ifs 的程序?

【问题讨论】:

  • 应该[6, 6, 7, 7]输出0还是7?
  • @Sweeper 它应该输出 7。第二个 6 包含在第一个 6-7 通道中。

标签: java arrays loops int


【解决方案1】:
public int sum67(int[] arr) {
    int sum = 0;
    boolean isIn67 = false;
    for (int i = 0 ; i < arr.length ; i++) {
        if (arr[i] == 6) {
            isIn67 = true;
            continue;
        } else if (arr[i] == 7 && isIn67) {
            isIn67 = false;
            continue;
        }
        if (!isIn67) {
            sum += arr[i];
        }
    }
    return sum;
}

以上是我的尝试。说明:

  • 只需一个循环即可遍历所有元素。在每次迭代中,都会使用一些 if 语句来确定是否应将该元素添加到总和中。
  • 有一个名为 isIn67 的变量指示 arr[i] 是否在 6-7 范围内,因此不应添加到总和中
  • 当我们遇到 6 时,我们将 isIn67 设置为 true。
  • 当我们遇到一个 7 并且isIn67 为真时,我们将isIn67 设置为假。
  • 使用 continue 是为了不计算那些 7s
  • 最后,如果我们不是 in67,我们将元素添加到总和中。

您的代码的问题可能是您嵌套太多。减去不需要的数字的行嵌套在外部循环中,因此它可能会执行比预期更多的次数,从而导致结果为负数。

【讨论】:

  • 我投了赞成票,但很高兴注意到这只有效,因为假设每 6 后面总是跟着一个 7。例如,如果 1236345 是一个有效的序列,它就不会不再工作了。
  • @JBNizet OP 不是在问题中说 6 后面总是跟着 7 吗?它也是粗体的。
  • 感谢清道夫!请问,作为新手程序员,continue 语句是如何工作的?
  • 而且@JBNizet 是的,保证每 6 后面跟着一个 7。
  • @NextTimeDW 使循环进入下一个迭代,而不执行当前迭代的其余部分。
【解决方案2】:

您使用的逻辑并不代表您想要做什么。以你的第一个例子,并考虑第二个循环(所以你总结了一切)

  1. 迭代直到看到 6
  2. 现在迭代直到看到前 7 个,然后减去包括最后 7 个在内的所有内容(&lt;= - 这就是第二个示例中 -3 的原因)
  3. 现在继续为接下来的 7 次执行此操作 - 您将前 6 次和前 7 次之间的所有内容加倍减去!
  4. 继续下一个 6 - 并做同样的事情 - 您将再次减去之前减去的内容。

我建议用笔和纸跟踪您的代码,看看它是如何工作的。一个更简单的解决方案是完全按照您的意愿行事:

int sum = 0;
boolean noLikey = false;
for (int i = 0; i < nums.length; i++) {
    if (! noLikey && nums[i] == 6 ) noLikey = true;
    if ( noLikey ) {
        if ( nums[i] == 7 ) noLikey = false;
        continue;
    }
    sum += nums[i];
}

这当然假设 6 后面总是跟着一个 7。

【讨论】:

  • 谢谢@kabanus!是否可以通过在任何地方插入 break 语句以任何方式挽救我的代码?另外,我应该把你提供的代码 sn-p 放在哪里?
  • @NextTimeDW 内部sum67。至于您的代码,您需要中断两次,并使用条件。如果你想自己重写它(我推荐),我建议从头开始,并尝试用代码真正遵循你的逻辑(我意识到这是编程的全部艺术)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 2022-11-13
  • 2019-04-04
相关资源
最近更新 更多