fix34codingbat java —为什么不起作用?

时间:2018-12-06 16:53:32

标签: java arrays for-loop if-statement

  

返回一个数组,该数组包含与给定数组完全相同的数字,但重新排列后,每个3后面紧跟一个4。不要移动3,但是其他每个数字都可以移动。数组包含相同数量的3和4,每个3后面都有一个数字,而不是3,并且数组中的3之前是3。这是link   

下面是我的代码。

public int[] fix34(int[] nums) {
  for(int k = 0; k<nums.length; k++)
  {
    if(nums[k] == 3)
    {
      int jay = nums[k+1];
      for(int j = 0; j<nums.length; j++)
      {
        if(nums[j] == 4)
        {
          nums[k+1] = nums[j];
          nums[j] = jay;
        }
      }
    }
  }
  return nums;

我想这样做,以便找到数字3时,继续寻找4(可能在3之前或之后),然后将数字切换为4,紧随其后的是3。但是,由于它不适用于所有情况,我猜我的代码不能完全做到这一点。否则,这是逻辑错误吗?任何帮助将不胜感激! (我知道那里还有其他解决方案,但我想确切地了解我的问题所在。)

4 个答案:

答案 0 :(得分:0)

每次找到j时,您将在0重新启动3。相反,您需要跟踪您处理的最后一个4的位置,并开始寻找它后面的下一个:

public int[] fix34(int[] nums) {
    int last4 = 0;
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] == 3) {
            while (nums[last4] != 4) {
                ++last4;
            }
            nums[last4] = nums[i + 1];
            nums[i + 1] = 4;
            ++last4;
        }
    }
    return nums;
}

答案 1 :(得分:0)

您的代码中存在逻辑错误。每次检查nums [k] == 3时,都会运行内部循环,该循环将3之后的元素与在数组中找到的 first 4交换。如果我能说明(尽管效果很差):

如果nums [k]!= 3,我们将继续循环,因为它没有任何作用。

您的示例数组= {1,3,2,5,3,4,4}

当k == 1时,则nums [k] == 3为真。

因此它将运行内部循环,并且数组将更改为:

由于第一个元素4位于索引5处,因此它交换了索引2处的2和索引5处的4

第一次执行内部循环后的数组:{1,3,4,5,3,2,4}

然后直到k == 4为止它什么都不做

当k == 4时,nums [k] == 3是正确的

因此它将运行内部循环,并且数组将更改为:

第二次执行内部循环后的结果数组:{1,3,2,5,3,4,4}

如您所见,它用索引5的前4个(索引2)交换了。但是前4个已经正确放置(通过第一次执行内部循环),并且不应移动。因此,您需要跟踪正确放置的最后一个元素4,并将内部循环的开始设置为在最后一个元素之后。让我知道这是否有意义。

就目前而言,您的程序正在执行此操作:找到第一个元素4,并将其放置在最后一个元素3之后(中间的一些元素被交换)。

答案 2 :(得分:0)

我保持您的逻辑并进行一些更改。
找到4并进行交换后,内部循环需要break
另外,在寻找4时,请绕过3之后的任何4。

public static int[] fix34(int[] nums) {
    for(int k = 0; k < nums.length; k++) {
        if(nums[k] == 3) {
            int jay = nums[k+1];
            if (jay != 4) {
                for (int j = 1; j < nums.length; j++) {
                    if (nums[j] == 4 && nums[j - 1] != 3) {
                        nums[k + 1] = 4;
                        nums[j] = jay;
                        break;
                    }
                }
            }
        }
    }
    return nums;
}

public static void main(String[] args) {
    int[] array1 = {1, 3, 1, 4};
    int[] array2 = {1, 3, 1, 4, 4, 3, 1};
    int[] array3 = {3, 2, 2, 4};

    System.out.println(Arrays.toString(array1) + "-->" + Arrays.toString(fix34(array1)));
    System.out.println(Arrays.toString(array2) + "-->" + Arrays.toString(fix34(array2)));
    System.out.println(Arrays.toString(array3) + "-->" + Arrays.toString(fix34(array3)));
}

将打印

[1, 3, 1, 4]-->[1, 3, 4, 1]
[1, 3, 1, 4, 4, 3, 1]-->[1, 3, 4, 1, 1, 3, 4]
[3, 2, 2, 4]-->[3, 4, 2, 2]

答案 3 :(得分:0)

您也可以在while循环中做到这一点,加油!

this.form = this.formBuilder.group({ ...
    status: [
        {
          value: test.status 
          disabled: true,
        }
    ],
    description: [
        test.description || null, [
          Validators.maxLength(100),
        ]
    ],