题目:
GIven an arrary nums
,write a function to move all 0
's to the end of it while maintaining the relative order of the non-zero elements.
给定一个数组nums
,编写一个函数将所有的0
移动到它的末尾,同时保持非零元素的相对顺序。
思路一:
(1)先学会检查
(2)试着局部修正
(3)重复执行直到没有错误
思路二:
每次完成一部分(子问题)
void moveZeroes(int* nums, int munsSize){
//1.判断什么时候完成—从左往右相邻比较
while(true){
int count = 0; //计数
for (int i = 0; i < numsSize; i++){
if (nums[i] == 0 && nums[i+1] != 0)//代表未完成
count++; //调换一次,计数器加一
int t = nums[i];
nums[i] = nums[i+1];
nums[i+1] = t;
break;
}
}
if (count == 0){
break;
}
return;
}
void moveZeroes(int* nums, int numsSize){
for (int k = 1; k < numSize; k++){ //限制最多跑个数次循环
for (int i = 1; i < numsSize; i++){
if (nums[i] == 0 && nums[i+1] != 0){
nums[i] = nums[i+1]
nums[i+1] = 0
}
}
}
return;
}
思路三:
直接写答案,先放不是0的,后放是0的。
有时需要额外的空间,观察写入和读取的位置,若写入后的东西不会在被读取则不需要额外空间,就可以in-place(原地)
void moveZeroes(int* nums, int numsSize){
int j = 0; //下一个放的位置
//先放不是0的
for (int i = 0; i < numsSize; i++){
if (nums[i] ! = 0){
nums[j] = nums[i];
j++;
}
}
//再放是零的
while (j < numsSize){
nums[j] = 0;
j++;
}
return;
}
思路四:
暴力解法,找出所有的排列组合可能性。