【问题标题】:Rearranging an array odds and evens using recursive method使用递归方法重新排列数组奇数和偶数
【发布时间】:2020-10-17 22:12:56
【问题描述】:

在这里,我尝试重新排序 int 元素数组,如下所示:2 4 6 8 1 3 5 7 9。

我尝试了下面的代码,但它不起作用。它打印它们与 1 2 3 4 5 6 7 8 9 相同。 我需要帮助来理解将这个数组重新排序为左边的偶数和右边的赔率的过程。

 static void Orgnaize(int[] data) {
     /* Initialize left and right indexes */
        int left = 0, right = data.length - 1; 
        
        for(int i =0;left < right; i++) 
        { 
            /* Increment left index while we see 0 at left */
            for(int j =0; data[left]%2 == 0 && left < right; j++) 
                left++; 
  
            /* Decrement right index while we see 1 at right */
            for (int k =0;data[right]%2 == 1 && left < right;k--) 
                right--; 
  
            if (data[left] %1 ==0) 
            { 
                /* Swap arr[left] and arr[right]*/
                int temp = data[left]; 
                data[left] = data[right]; 
                data[right] = temp; 
                left++; 
                right--; 
                Orgnaize(data); 
            } 
        } 
     }

我做错了什么?

【问题讨论】:

  • 你可以试试这个吗,geeksforgeeks.org/…
  • 使所有偶数为负数并对它们进行排序。再次让一切变得积极。
  • 这行不通兄弟,那样的话,8 6 4 2 1 3 5 7 9。

标签: java arrays algorithm sorting data-structures


【解决方案1】:

让偶数为负数,然后排序

class Main{
    public static void main(String[] args){
        int[] arr={1,2,3,4,5,6,7,8,9};
        
       
        for(int i=0;i<arr.length;i++){
            if(i%2!=0){
                arr[i]=-arr[i];
            }
        }
        Arrays.sort(arr);

        //positive again
        for(int i=0;i<arr.length;i++){
            if(arr[i]<0){
                arr[i]=-arr[i];
            }
        }
        for (int i:arr){
            System.out.println(i);
        }
    }
}

【讨论】:

  • 是的,但我需要使用递归方法来做到这一点
  • 它不会起作用,因为那样会导致 8 6 4 2 1 3 5 7 9 而不是这个 2 4 6 8 1 3 5 7 9。
  • 我找到你了@SabareeshMuralidharan
  • 只需将所有代码复制到方法中。RizoTomma Totta
【解决方案2】:

你的价值交换逻辑有一个小问题......应该是

int temp = arr[first];
arr[first] = arr[last];
arr[last] = temp;

【讨论】:

  • 如何在main方法中测试?
【解决方案3】:
static void Orgnaize(int[] data, int left, int right) {
    if(left >= right) {
        return;
    }

    if(data[left] % 2 == 0 && data[right] % 2 == 1) {
        // both pointers are fine so move both
        Orgnaize(data, left + 1, right - 1);
    }
    else if(data[right] % 2 == 1) {
        // if right is odd then right one is fine
        Orgnaize(data, left, right-1);
    }
    else if(data[left] % 2 == 1) {
        // right is even which is not correct(since we checked just before) and
        // left is odd which is wrong too
        // so swap
        int temp = data[left];
        data[left] = data[right];
        data[right] = temp;
        Orgnaize(data, left + 1, right - 1);
    }
    else {
        // only case remaining
        // right is even(wrong) and left is even(fine)
        // so move left
        Orgnaize(data, left + 1, right);
    }
}

通过Orgnaize(arr, 0, arr.length - 1)调用这个函数

【讨论】:

  • 如何在main方法中测试?
  • 调用 Orgnaize(arr, 0, arr.length - 1)
  • 欢迎。我很高兴能帮上忙 :)
【解决方案4】:

可能会有更优化的解决方案 - 但到目前为止,这个解决方案能够重新排序1、2、3、4、5、6、7、8、9、10、11、12、13 到 2, 4, 6, 8, 10, 12, 1, 3, 5, 7, 9, 11, 13 ... 调用它由organize(arr, 0);

    static void organize(int[] arr, int first) {
    if ((first + 1) < (arr.length - 1)) {
        if (arr[first] % 2 == 1) {
            int second = first + 1;
            boolean evenFound = false;
            if (arr[second] % 2 != 0) {
                for (int i = (second + 1); i < (arr.length - 1); i++) {
                    if (arr[i] % 2 == 0) {
                        second = i;
                        evenFound = true;
                        break;
                    }
                }
                for (int i = second; i > first && evenFound; i--) {
                    int temp = arr[i];
                    arr[i] = arr[i - 1];
                    arr[i - 1] = temp;
                }
            } else {
                int temp = arr[first];
                arr[first] = arr[second];
                arr[second] = temp;
            }
        }
            organize(arr, first + 1);
    }
}

【讨论】:

    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多