Java 重新排列(交换)数组值

Java 重新排列(交换)数组值,java,arrays,Java,Arrays,我试图解决编码BAT的修复问题: 返回一个数组,该数组包含与给定数组完全相同的数字,但需要重新排列,以便每3个数字后面紧跟一个4。不要移动3,但每隔一个数字可能移动一次。数组包含相同数量的3和4,每个3后面都有一个不是3的数字,数组中的3出现在任何4之前 修正34[1,3,1,4]→ [1, 3, 4, 1] 修正34[1,3,1,4,4,3,1]→ [1, 3, 4, 1, 1, 3, 4] 修正34[3,2,2,4]→ [3, 4, 2, 2] 我的代码适用于除以下情况之外的所有情况: 1.

我试图解决编码BAT的修复问题:

返回一个数组,该数组包含与给定数组完全相同的数字,但需要重新排列,以便每3个数字后面紧跟一个4。不要移动3,但每隔一个数字可能移动一次。数组包含相同数量的3和4,每个3后面都有一个不是3的数字,数组中的3出现在任何4之前

修正34[1,3,1,4]→ [1, 3, 4, 1] 修正34[1,3,1,4,4,3,1]→ [1, 3, 4, 1, 1, 3, 4] 修正34[3,2,2,4]→ [3, 4, 2, 2] 我的代码适用于除以下情况之外的所有情况:

1.修正34[1,3,1,4,4,3,1] → [1,3,4,1,1,3,4]预计 [1,3,4,1,4,3,1]实际输出 2.fix34[5,3,5,4,5,4,5,4,3,5,3,5] → [5,3,4,5,5,5,5,5,3,4,3,4]预计 [5,3,4,5,5,4,5,4,3,5,3,5]实际输出 似乎不明白为什么,提前谢谢

public int[] fix34(int[] nums) {
      
      int [] result = new int [nums.length];
      int temp = 0;
      for(int i = 0; i < nums.length; i++){
        if(nums[i] == 3){
          result[i] = 3;
          for(int j = i + 1; j < nums.length; j++){
            if(nums[j] == 4){
              temp = nums[i + 1];
              result[i + 1] = 4;
              result[j] = temp;
              nums[j] = temp;
              break;
            }
          }
        }else if(result[i] == 0){
          result[i] = nums[i];
        }
      }
      return result;
    }

当前实现的伪代码是:

对于每个元素{ 如果元素是3{ 扫描以下元素以查找4; 如果我们找到一个{ 在第三个元素之后立即将第四个元素与第三个元素交换; } } } 当尝试配对的3个测试用例之后没有4个出现时,不成功的测试用例将失败。基于预期产出

1.修正34[1,3,1,4,4,3,1] → [1,3,4,1,1,3,4]预计 您的代码还必须能够移动当前正在处理的3之前出现的4,如下面的第二次交换所示:

↔↔ ↕ ↕ [1, 3, 1, 4, 4, 3, 1] ↕ ↕ ↔↔↔↔↔ 换句话说,当前代码只能向左移动4。您还需要能够向右移动4

下面是一个相当简单的实现,它似乎可以做到这一点:

/** *返回重新排列元素的数组。 * *规则: * 1. [输入]阵列包含相同数量的3和4。 * 2. [输入]每个3后面都有一个不是3的数字。 * 3. [输入]数组中的3出现在任何4之前。 * 4. [输出]返回一个数组,该数组包含与 *给定数组,但重新排列以使每3个 *然后是4。 * 5. [输出]不要移动3,但每隔一个数字可能移动一次。 */ 公共静态int[]fix34int[]nums{ 如果nums.length>0&&nums[nums.length-1]==3{ //防弹:根据规则2,真的不应该发生 抛出新的IllegalArgumentExceptionInput数组不能以3结尾; } List positionOf3s=新阵列列表; List positionOf4s=新阵列列表; int[]result=nums.clone; 对于int resultarayindex=0;resultarayindex4s.size的位置{ //防弹:根据规则1,真的不应该发生 抛出新的IllegalArgumentException String.format3需要配对:%d;4可用于交换:%d, 位置为3s.尺寸,位置为4s.尺寸; } /* *使用相应的 *将候选者从位置4s交换 */ 对于int-listOf3sIndex=0;listOf3sIndex请不要期望我们能记住所有的编码挑战/竞赛。告诉我们代码应该做什么,它实际做什么,以及您不清楚其中的哪一部分。是的,请您的问题显示您的代码为您列出的两种情况生成了什么,因为我的代码适用于除以下情况之外的所有情况。