1、来源:点击打开链接
2、题目:
Given an array nums
, write a function to move all 0
's to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12]
, after calling your function, nums
should be [1, 3, 12, 0, 0]
.
Note:
- You must do this in-place without making a copy of the array.
- Minimize the total number of operations.
<pre code_snippet_id="1774573" snippet_file_name="blog_20160721_1_6540781" name="code" class="cpp">void moveZeroes(int* nums, int numsSize) {
int i=0,j=numsSize-1,temp,k;
while(i<j){
if(nums[j]==0){
j--;
if(nums[i]!=0)
i++;
}
else{
if(nums[i]!=0)
i++;
else{
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
i++;
j--;
}
}
}
for(j=0;j<i-1;j++){
for(k=0;k<i-1-j;k++){
if(nums[k]>nums[k+1]){
temp=nums[k];
nums[k]=nums[k+1];
nums[k+1]=temp;
}
}
}
}
此方法有一处可以改进,加一个标志。因为冒泡排序结束的条件是“在一趟排序过程中没有进行交换操作的记录”
4、将排序改为快排的代码(依旧是通过17/21):
void moveZeroes(int* nums, int numsSize) {
int i=0,j=numsSize-1,temp,k;
while(i<j){
if(nums[j]==0){
j--;
if(nums[i]!=0)
i++;
}
else{
if(nums[i]!=0)
i++;
else{
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
i++;
j--;
}
}
}
qSort(nums,0,i-1);
}
void qSort(int *nums,int low,int high){
if(low<high){
int i=low,j=high,key=nums[low];
while(i<j){
while(i<j&&nums[j]>=key)
j--;
swap(&nums[i],&nums[j]);
while(i<j&&nums[i]<=key)
i++;
swap(&nums[i],&nums[j]);
}
qSort(nums,low,i-1);
qSort(nums,i+1,high);
}
}
void swap(int *a,int*b){
int temp=*a;
*a=*b;
*b=temp;
}
5、从测试错误中发现,提木意思为“ maintaining the relative order of the non-zero elements.”保持原来顺序,汗。。。
Input:
[4,2,4,0,0,3,0,5,1,0]
Output:
[1,2,3,4,4,5,0,0,0,0]
Expected:
[4,2 ,4,3,5,1,0,0,0,0]
void moveZeroes(int* nums, int numsSize) {
int i,j=0;
for(i=0;i<numsSize;i++){
if(nums[i]!=0){
nums[j]=nums[i];
j++;
}
}
for(;j<numsSize;j++)
nums[j]=0;
}