4 回答
TA贡献1765条经验 获得超5个赞
规则似乎是奇数索引 (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),而简单的相邻值交换则不会。
我会将编码作为练习留给您完成。
TA贡献1836条经验 获得超13个赞
我知道您的问题有多个有效输出,但我有同样的想法 @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]);
TA贡献1854条经验 获得超8个赞
像这样的事情可以解决目的:
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));
添加回答
举报