目录
移除元素
法一,暴力覆盖
int removeElement(int* nums, int numsSize, int val){ int len=numsSize; int i=0; for(i=0;i<numsSize;i++) { if(nums[i]==val)/当nums的元素和val一致时 { int start=i+1;/把这个元素消掉,就把这个元素给覆盖掉 while(start<numsSize)//当start的值到numssize时就停止 { nums[start-1]=nums[start];//前一个的值等于后一个的值 start++; } len--;//每执行一次,就把len--,最终返回的就是len的值 } } return len; }
法二,数组接收
int removeElement(int* nums, int numsSize, int val) { int arr[numsSize+1];//我们一开始要把arr的长度赋为numssize+1,因为假如说nums为空,也就是说numssize的值为0,arr就是一个无长度的数组,是错误的 memset(arr,0,sizeof(arr)); int i=0; int j=0; int count=0; for(i=0;i<numsSize;i++) { if(nums[i]!=val)//当nums里面的值和val不一样时,就把nums的值赋给arr来接收 { arr[j]=nums[i]; j++; count++;//同时count++,最终返回count } } for(i=0;i<count;i++) { nums[i]=arr[i];//最后在把arr的值赋给nums,因为要返回的是nums } return count; }
法3双指针判断
int removeElement(int* nums, int numsSize, int val) { int src=0,dst=0; int i=0; for(i=0;i<numsSize;i++) { if(nums[src]!=val) { nums[dst]=nums[src]; dst++; src++; } else { src++; } } return dst; }
合并两个有序数组
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){ int end=m+n-1; int end1=m-1; int end2=n-1; while(end1>=0&&end2>=0) { if(nums1[end1]>nums2[end2]) { nums1[end]=nums1[end1]; end1--; end--; } else { nums1[end]=nums2[end2]; end2--; end--; } } while(end2>=0) { nums1[end]=nums2[end2]; end2--; end--; } }