代码之家  ›  专栏  ›  技术社区  ›  AnagramDatagram

求整数数组的和-去掉6和7之间的所有数字(包括6和7)

  •  0
  • AnagramDatagram  · 技术社区  · 6 年前

    我想写一个程序,把所有的数字加在一个整数数组中-除了一个例外!因为数字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 是的。

    所以本质上:

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

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Sweeper    6 年前
    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语句来确定是否应该将该元素添加到sum中。
    • 有一个变量叫做 isIn67 表示是否 arr[i] 在6-7范围内,因此不应添加到总和中
    • 当我们遇到一个6,我们设置 伊辛67 真的。
    • 当我们遇到一个7 伊辛67 是真的,我们设定 伊辛67 错了。
    • continue 是为了我们不去数那些7
    • 最后,如果我们没有 in67 ,我们将元素添加到和中。

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

        2
  •  1
  •   kabanus    6 年前

    你使用的逻辑并不代表你想做什么。以第一个例子为例,考虑第二个循环(因此您已经总结了所有内容)

    1. 迭代直到看到6
    2. 现在迭代直到看到前7个,然后减去中间的所有内容,包括最后7个( <= -这就是为什么 -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。