【问题标题】:How to skip certain array indexes?如何跳过某些数组索引?
【发布时间】:2018-11-18 16:29:52
【问题描述】:

只需要对数组中的奇数进行排序,但偶数必须保留在原位。

这是我的代码:

public static int[] sortArray(int[] array) {

    int length = array.length;
    int temp = 0;


    for (int i = 0; i < length; i++) {
        for (int j = 1; j < length - i; j++) {
            if (j > 0 && array[j] % 2 == 0)continue;

                if (array[j - 1] > array[j]){
                    temp = array[j - 1];
                    array[j - 1] = array[j];
                    array[j] = temp;
                }
            }
        }

    return array;
}

输入:new int[]{5, 3, 2, 8, 1, 4, 0}

输出:[1, 3, 5, 2, 8, 4, 0]

但我需要:[1, 3, 2, 8, 5, 4, 0]

如何跳过数组中的某些索引?

认为这应该与continue操作符连接,但我不知道该怎么做。

【问题讨论】:

  • 当array[j] 是奇数时,您不能将其直接与前任交换,因为后者可能是偶数。您需要找到最近的前任,这很奇怪,以查看交换是否正常。

标签: java arrays algorithm sorting


【解决方案1】:

改用此代码:

public static int[] sortArray(int[] array) {

    int length = array.length;

    for (int i = 0; i < length - 1; i++) {
        int k = -1; // The index of last odd element
        for (int j = 0; j < length - i; j++)
            if (array[j] % 2 != 0) {
                if (k >= 0 && array[k] > array[j]) {
                    int temp = array[k];
                    array[k] = array[j];
                    array[j] = temp;
                }
                k = j;
            }
    }

    return array;
}

【讨论】:

  • 提示:返回数组是可选的,因为外部数组会被修改。
【解决方案2】:

对于像冒泡排序这样的简单算法,您可以使用continue 忽略偶数

for(int i=0; i<ar.length; i++) {
    if(ar[i] % 2 == 0) continue;
    for(int j=i; j<ar.length; j++) {
        if(ar[j] % 2 == 0) continue;

        if(ar[i] > ar[j]) {
        int temp = ar[i];
        ar[i] = ar[j];
        ar[j] = temp;
    }
}

【讨论】:

  • 为此输出:[3, 1, 5, 2, 8, 4, 0],应该是[1, 3, 2, 8, 5, 4, 0]
  • 您的声明 - but even values must remain on their places. : 2 从第三个索引移动到第二个索引? (就数组索引而言),8 从第 4 个索引移动到第 3 个索引。
【解决方案3】:

只是为了好玩:

使用 Lamda 和 Stream ;-)

import java.util.Arrays;

public class IntSort {

    public static void main(String[] args) {
        int[] array = new int[]{5, 3, 2, 8, 1, 4, 0};

        sortOnlyOddRemainEven(array);

        System.out.println(Arrays.toString(array));
    }

    public static void sortOnlyOddRemainEven(int[] array) {

        // get list of sorted odd numbers
        int[] odd = Arrays.stream(array).filter( x -> x % 2 != 0).sorted().toArray();

        int c = 0;
        for (int i = 0; i < array.length; i++) {
            if(array[i] % 2 != 0)
            {
                // replace each odd number in the array with the sorted one
                array[i] = odd[c++];
            }
        }
    }
}

【讨论】:

  • 您也可以将 for 循环替换为流。
  • 您的意思是地图还是更好的解决方案? Map is not a nice version
  • 流并不总是比 for 循环更好。
  • 请看我的回答。
  • @KorayTugay: pop() 是个好主意 ;-)
【解决方案4】:

另一种可能的解决方案是将原始数组包装在 OddArray 类中,这使得底层原始数组看起来只包含奇数条目。比如:

class OddArray {

  int[] baseArray;

  // Constructor
  OddArray(int[] base) {
    this.baseArray = base;
  }

  // Getter
  public int get(int index) {
    return baseArray[2 * index + 1];  // Odd entries only.
  }

  // Setter
  public void set(int index, int value) {
    baseArray[2 * index + 1] = value;  // Odd entries only.
  }

  // Return changed baseArray.
  public int[] getBaseArray() {
    return baseArray;
  }

} // end class OddArray

这需要添加一些错误检查等,但它隐藏了所有偶数位置,允许您将数组视为仅存在奇数位置并且编号为 0、1、2,... 一旦数组排序,调用OddArray.getBaseArray() 检索整个数组。

【讨论】:

    【解决方案5】:

    在我看来,这段代码在逻辑上是错误的。 因为如果你用这个代码切换号码,

    temp = array[j - 1];
    array[j - 1] = array[j];
    array[j] = temp;
    

    你不能保持偶数的位置。

    只搜索数组中的奇数,然后对奇数进行排序怎么样?

    【讨论】:

    • tnen 我需要在数组中的位置返回排序 nubrers。对奇数排序不是问题,问题是在数组中将其返回到它们的位置,而不是与偶数混合。偶数应留在原位
    • @IMBABOT 这不是问题。首先,将奇数的索引存储在一个数组中。然后,仅对奇数进行排序。然后,将每个奇数放入存储的索引数组给定的索引中。
    【解决方案6】:

    另一个关于流的答案:

    import java.util.Arrays;
    import java.util.LinkedList;
    import java.util.stream.Collectors;
    import java.util.stream.IntStream;
    
    class IntSort {
    
        public static void main(String[] args) {
            int[] array = new int[]{5, 3, 2, 8, 1, 4, 0};
            final int[] result = sortOnlyOddRemainEven(array);
        }
    
        public static int[] sortOnlyOddRemainEven(int[] array) {
            final LinkedList<Integer> collect;
            collect = Arrays.stream(array)
                            .filter(x -> x % 2 != 0)
                            .boxed()
                            .sorted()
                            .collect(Collectors.toCollection(LinkedList::new));
    
            return IntStream.of(array)
                            .map(value -> value % 2 != 0 ? collect.pop() : value)
                            .toArray();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 1970-01-01
      • 2018-05-28
      • 1970-01-01
      • 2020-09-11
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多