自己做坑人网站的软件nba最新排行
移动数组中的0放到数组最后面:
eg:
[1,3,]
遍历:
{0,12,0,1,0}
k=1就是第一次 i=0
12 0 0 1 0
第二次不变
第三次不变
第四次 12 0 1 0 0
k=2
第一次 12 1 0 0 0 成功
剩下就是把k遍历结束即可。
#include <stdio.h>
#include <bits/stdc++.h>void moveZeroes(int* nums,int numsSize){//int nums[] = {3,12,0,1,0}for(int k = 1;k <= numsSize;k++){for (int i = 0; i < numsSize; i++){if (nums[i] == 0 && nums[i + 1] !=0){nums[i] = nums[i + 1];nums[i+1] = 0;}}}return;
}int main() {int times = 5;int i;int nums[] = {0,12,0,1,0};moveZeroes(nums,5);for ( i = 0; i < times; i++){printf("%d",nums[i]);if (i != times -1){printf("%c ",',');}}}
冒泡交换:
void moveZeroes(int* nums,int numsSize){//int nums[] = {3,12,0,1,0}for(int k = 1;k <= numsSize;k++){for (int i = 0; i < numsSize; i++){if (nums[i] == 0 && nums[i + 1] !=0){int t = nums[i];nums[i] = nums[i + 1];nums[i+1] = t;}}}return;
}
双指针:
初始时i j = 0
如果下一个数字的值是非零那么就 i++ j++ 因为i j=1 所以无需交换
知道当前下标j nums[j] 为 0 就交换 此时i 还处于比j小 1 的位置,因此就可以正常交换达到把0放到后面的任务。
#include <stdio.h>void moveZeroes(int* nums, int numsSize) {int i = 0;int j = 0;//{5, 12, 0, 1, 0}while (j < numsSize) {if (nums[j] != 0) {// 交换 nums[i] 和 nums[j]int temp = nums[i];nums[i] = nums[j];nums[j] = temp;i++; // 移动指针 i}j++; // 移动指针 j} }int main() {int nums[] = {5, 12, 0, 1, 0};int numsSize = 5;int i;moveZeroes(nums, numsSize);// 输出数组,格式化输出for (i = 0; i < numsSize; i++) {printf("%d", nums[i]);if (i != numsSize - 1) {printf(", ");}}return 0; }