个人学习编程(3-19) leetcode刷题
移动数组中的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; }