数组中的顺序增加或减少

时间:2019-06-06 13:29:45

标签: java arrays algorithm data-structures

我有一个元素数组,需要根据以下规则进行打印:

ai1 <= ai2 >= ai3 <= ai4 >= ai5 <= ai6

输入列表= 30、12、49、6、10、50、13

预期输出= [10、6、30、12、49、13、50]

请向我建议一种解决此问题的方法。 这是我尝试过的。

      Arrays.sort(arr);

        for(i=2;i<n;i++)
        {
            if(i%2==0)
            {
                int temp =arr[i-1];
                arr[i-1]=arr[i];
                arr[i] = temp;
            }
        }

        System.out.println("\n");
        for(i=0;i<n;i++)

还可以帮助我找到给定方法的时间复杂度和空间复杂度。

4 个答案:

答案 0 :(得分:0)

  1. 按升序排列数组。
  2. 从i = 2开始,对于每个偶数索引,交换a[i]a[i-1]
  3. 时间和空间复杂度与排序相同

答案 1 :(得分:0)

规则似乎是奇数索引(1、3、5,...)处的值必须大于相邻索引处的值,例如索引5的值必须大于索引4和6的值。

最简单的方法是在偶数索引处放置最小值,在奇数索引处放置最大值。要将值分成最小和最大,请先对值进行排序。

示例:

Input:    1,4,7,9,1,3,5,10,11

Sorted:   1,1,3,4,5,7,9,10,11
          └───────┘ └───────┘
          smallest   largest

            ↓   ↓   ↓    ↓     Odd indexes
Result:   1,7,1,9,3,10,4,11,5
          ↑   ↑   ↑    ↑    ↑  Even indexes

以这种方式进行操作可确保解决方案正确,并假设有可能解决。例如。如果输入为1,1,1,1,2,2,2,您仍将获得有效的解决方案(1,2,1,2,1,2,1),而仅交换相邻值将不会。

我将保留编码作为练习供您完成。

答案 2 :(得分:0)

我知道您的问题有多个有效输出,但是我有相同的想法提到@shuki avraham,@ Andreas对此进行了详细说明。

因此,您对它进行了排序,然后在数组中写出了最小然后最大的数字,依此类推。这是您的操作方式:

Arrays.sort(arr); 

for(int i = 0; i < n / 2; i++) {
    System.out.print(arr[i] + " " + arr[n-i-1] + " ");
}

if(n % 2 == 1) System.out.print(arr[i]);

答案 3 :(得分:0)

这样可以解决目的:

 int[] x = {1, 2, 3, 4, 5, 7, 9, 12, 10, 11, 6, 0};
        //sort asc
        Arrays.sort(x);

        //swap at alternate, take care of odd/even length array
        for (int i = 0; i < x.length - 2;) {
            int temp = x[i + 1];
            x[i + 1] = x[i + 2];
            x[i + 2] = temp;
            i += 2;
            if (i >= x.length) {
                i--;
            }
        }
        System.out.println(Arrays.toString(x));