给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。用c语言帮我实现
时间: 2024-10-15 18:12:09 浏览: 21
js代码-给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
在 C 语言中,你可以通过双指针的方式实现这个功能。假设有一个整型数组 `nums`,我们可以创建两个指针 `left` 和 `right`,分别指向数组的开始和结束。`left` 指针用于找到第一个非零元素,而 `right` 则用于记录最后一个非零元素的位置。
```c
#include <stdio.h>
void moveZeroes(int* nums, int n) {
int left = 0; // 左指针,找非零元素
for (int i = 0; i < n; i++) {
if (nums[i] != 0) { // 如果找到非零元素
// 将该元素向右移动,腾出位置
for (int j = i; j >= left; j--) {
nums[j] = nums[j + 1];
}
// 更新非零元素的位置
nums[left++] = nums[i];
}
}
// 清理末尾的0
while (left < n && nums[left] == 0) {
left++;
}
}
// 测试函数
int main() {
int nums[] = {0, 1, 0, 3, 12};
int n = sizeof(nums) / sizeof(nums[0]);
moveZeroes(nums, n);
// 输出结果
for (int i = 0; i < n; i++) {
printf("%d ", nums[i]);
}
return 0;
}
```
当你运行上面的代码,`moveZeroes` 函数将在原地修改数组 `nums`,使得所有的0都移动到了数组的末尾,同时保持了非零元素的原始顺序。注意,在处理完所有非零元素后,还需要清理末尾可能存在的额外的0。
阅读全文