原文题目:
读题:
将数组中元素0移到数组的后面,其他元素的相对位置保持不变,那么就不能用快速排序的分治法思想了,用两个指针在头和尾进行遍历
解题:
1)取两个索引,一个索引i指向第一个0,另一个索引j在索引i之后寻找第一个不为0的元素,交换位置,直至最后
2)由于不能copy数组,因此遍历数组,如果遇到0则跳过,非0则放入数组中,然后在尾部补齐0即可;
AC代码:
//方法一:交换 class Solution { public: void swap(int *a,int *b) { int temp = *a; *a = *b; *b = temp; } void moveZeroes(vector<int>& nums) { int len = nums.size(); int i =0; int j =0; int temp =0; if (!len) return; while(i < len && j < len) { while(i < len &&nums[i]!=0) { i++; } if(i < len) { j = i+1; while(j < len &&nums[j]==0) { j++; } if(j < len) { swap(&nums[i],&nums[j]); } } } } }; //方法二:先添加非0,然后补齐0 class Solution { public: void moveZeroes(vector<int>& nums) { int size = nums.size(); if (!size) return; int i = 0, j = 0; while(i < size) { if (!nums[i]) { i++; } else { nums[j++] = nums[i++]; } } while(j < i) { nums[j++] = 0; } } }; int main() { Solution s; int result; vector <int> vec; vec.push_back(2); //vec.push_back(0); //vec.push_back(0); vec.push_back(1); //vec.push_back(0); s.moveZeroes(vec); for(int i =0; i < vec.size();i++) { cout << vec[i] << endl; } getchar(); }