首页 文章

偶数数字在奇数之前使用数组而且只有一个循环

提问于
浏览
1

我尝试了这个问题 . 我没有得到正确的解决方案 . 请帮助 .

问题:返回一个包含与给定数组完全相同的数字的数组,但重新排列,以便所有偶数都在所有奇数之前 . 除此之外,数字可以是任何顺序 . 您可以修改并返回给定的数组,或者创建一个新数组 . evenOdd([1,0,1,0,0,1,1])→[0,0,0,1,1,1,1]
evenOdd([3,3,2])→[2,3,3]
evenOdd([2,2,2])→[2,2,2]

public int[] evenOdd(int[] nums) {

  int l = nums.length;

  if(l<2)
  return nums;

  int j=l-1;
  for(int i=0;i<l;i++)
  {
    if(nums[i]%2==1)
    {
      while(j>i && nums[j]%2!=0) {
          j--;
      }         
      int t=nums[i];
      nums[i]=nums[j];
      nums[j]=t;

      j--;           
    }  
  }   
  return nums;
}

5 回答

  • 1

    由于数组的顺序无关紧要,你只需要一个循环,你可以尝试下面的函数,

    public int[] evenOdd(int[] nums) {
        if (nums.length < 2) return nums;
    
        int[] result = new int[nums.length];
        int even = 0;
        int odd = nums.length - 1;
    
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] % 2 == 0)
                result[even++] = nums[i];
            else
                result[odd--] = nums[i];
        }
        return result;
    }
    
  • 1

    你真的非常接近 . 如果你只是包装你拥有的代码:

    int t = nums[i];
    nums[i] = nums[j];
    nums[j] = t;
    j--;
    

    在一个if里面

    if (j > i)
    

    你的代码确实有效 .

  • 2

    不确定这是否“作弊”,但你可以创建2个阵列,1个保持平均值,1个保持赔率 . 在循环中,您可以将每个值的所有数字复制到偶数或奇数数组,然后在循环之后,将数组连接/合并在一个新数组中并返回新数组 .

  • 1

    如果性能不是很重要,您可以使用流:

    static int[] evenOdd(int[] nums) {
        return Arrays.stream(nums)
                .boxed()
                .sorted(Comparator.comparingInt(i -> i % 2))
                .mapToInt(i -> i)
                .toArray();
    }
    

    不幸的是,IntStream没有 sorted 方法需要 Comparator (只有parameterless method,这就是为什么你必须使用Stream.sorted(Comparator)来装箱和取消装箱的原因 .

  • 2

    这是一个需要 O(N) 时间和 O(1) 空间来完成任务的代码 . 我为 Python 代码道歉 .

    arr = list(map(int, raw_input().split()))
    
    i = 0
    j = len(arr) - 1
    
    while i<j:
        if arr[i]%2 != 0 and arr[j]%2 == 0:
            t = arr[i]
            arr[i] = arr[j]
            arr[j] = t
            i = i + 1
            j = j -1
    
        elif arr[i]%2 == 0 and arr[j]%2 == 0:
            i = i + 1
    
        elif arr[i]%2 == 0 and arr[j]%2 != 0:
            j = j - 1
    
        else:
            j = j - 1
    
    print arr
    

    Explanation :代码逻辑非常自我解释 . 我们有两个计数器,从左端开始 i ,从右端开始 j . 如果左计数器指向 even ,那么我们只是增加它,因为它在正确的位置 . [记住你想把平均值向左移动 . 所以这甚至已经在数组的左侧 . 所以我们只是递增 i ] . 请查看代码逻辑,找出基于偶数或奇数元素的当前指针采取的操作 .

    例如:

    如果我们发现指向 oddi 和指向偶数的j` ,那么我们交换并移动两个指针 . 我希望这是可以理解的

    上面的解决方案是就地的,需要O(1)空间和O(N)时间...希望这有助于!!

相关问题