给定一个非负整数数组 a, a 中一半整数是奇数,一半整数是偶数。对数组进行排序,以便当 a[i] 为奇数时,i 也是奇数;当 a[i] 为偶数时, i 也是偶数。你可以返回任何满足上述条件的数组作为答案。java
时间: 2023-05-03 08:00:13 浏览: 87
题目描述:给定一个非负整数数组 a,a 中一半整数是奇数,一半整数是偶数。对数组进行排序,使得数组中奇数位置上的数都是奇数,偶数位置上的数都是偶数。你可以返回任何满足条件的数组作为答案。
思路:可以使用双指针,一个指针指向第一个偶数,另一个指针指向第一个奇数,然后交换这两个元素,继续左右移动,直到两个指针相遇。
代码:
class Solution {
public int[] sortArrayByParityII(int[] a) {
int i = 0, j = 1;
while (i < a.length && j < a.length) {
while (i < a.length && a[i] % 2 == 0) {
i += 2;
}
while (j < a.length && a[j] % 2 == 1) {
j += 2;
}
if (i < a.length && j < a.length) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
return a;
}
}
相关问题
用c语言实现,给定一个非负整数数组nums,nums中一半是奇数,一半是偶数;对数组进行排序,以便当nums[i]为奇数时,i也是奇数;当nums[i]为偶数时,i也是偶数;
在C语言中实现这个需求,可以采用双指针法,并结合快速排序的思想。这里我们先创建一个辅助函数用于交换数组元素的位置,然后利用两个指针`i`(指向奇数位置)和`j`(指向偶数位置),保证它们始终向中间移动并保持奇偶性一致。
下面是一个简单的步骤描述:
1. 初始化两个指针`i = 0`(开始于数组首位的奇数位置)和`j = nums.length - 1`(结束于数组尾部的偶数位置)。
2. 当`i < j`时,进入循环:
a. 如果`nums[i]`是偶数并且`nums[j]`是奇数,交换这两个元素:`swap(&nums[i], &nums[j])`。
b. 否则,如果都是奇数或都是偶数,则分别自增和自减一个步长:`i += 2` 和 `j -= 2`。
3. 循环结束后,数组会满足题目要求。
以下是伪代码示例:
```c
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void sortArrayWithEvenOdd(int nums[], int length) {
int i = 0, j = length - 1;
while (i < j) {
if (nums[i] % 2 == 0 && nums[j] % 2 == 1) {
swap(&nums[i], &nums[j]);
} else if (nums[i] % 2 != 0 && nums[j] % 2 != 1) {
i += 2; // 如果都是奇数,不动
j -= 2; // 如果都是偶数,不动
} else {
i++; // 都不是对方需要的情况,只动一个
}
}
}
```
C#给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c
在C#中,判断一个非负整数c是否可以表示为两个整数a和b的平方和,即`a^2 + b^2 = c`,这是一个经典的数学问题,通常涉及到离散对数或者二分查找的解决方案。这个问题可以转换成寻找是否有整数解 `(x, y)` 满足 `x*x + y*y = c` 的形式。
一种常见的算法是使用二分查找和一些数学技巧。首先,我们知道a和b的平方都是非负的,所以c也必须是非负的。当c是奇数时,不可能有偶数的平方和等于它,因为所有偶数的平方都是偶数;同样,当c是4的倍数时,需要a和b都包含一个因子2,这也不可能。对于其他情况,我们可以从0开始,对每个可能的a值,计算对应的b值(或者反过来),看是否满足平方和等于c。这个过程可以用循环来实现,并通过检查每一步的结果是否符合条件来结束搜索。
以下是伪代码的大致框架:
```cpp
bool hasSolution(int c) {
if (c < 0 || c % 4 == 0 && c != 0) return false; // 排除负数和非奇数的c
int sqrtC = (int)Math.Sqrt(c);
for (int a = 0; a <= sqrtC; a++) {
int potentialB = Math.Sqrt(c - a * a); // 如果能开方则尝试,否则跳过
if (potentialB * potentialB == c - a * a)
return true;
}
return false;
}
```
阅读全文