27. 移除元素
- 双指针法
- dest用来放入不等于val的值,src用来检查元素是否等于val,等于则不放入- dest并向后偏移,遇到不等于val的值时停下赋给drst并两者同时右移一位
int removeElement(int* nums, int numsSize, int val){
int dest=0,src=0;
while(src<numsSize)
{
//遇到不等于val的值时停下赋给drst,两者同时右移
if(nums[src]!=val)
{
nums[dest++]=nums[src++];
}
//等于则不放入dest并向右偏移
else
{
src++;
}
}
return dest;
}
26. 删除有序数组中的重复项
- 在dest处放入有效元素,
- i==j 则 j 后移,
- 不等则 i 处的值赋给 dest,dest++, i=j, j++, 以此类推
int removeDuplicates(int* nums, int numsSize)
{
if(numsSize==0)
{
return 0;
}
int i=0;
int j=0;
int dest=0;
while(j<numsSize)
{
if(nums[i]==nums[j])
{
j++;
}
else
{
nums[dest++]=nums[i];
i=j;
j++;
}
}
nums[dest]=nums[i];
dest++;
return dest;
}
88. 合并两个有序数组
各自从后向前比较,较大值放入主数组
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
if(nums1==NULL)
return;
int dest=m+n-1;
int i=m-1;
int j=n-1;
while(i>=0 && j >=0)
{
if(nums1[i]<nums2[j])
{
nums1[dest--]=nums2[j--];
}
else
{
nums1[dest--]=nums1[i--];
}
}
if(i<0)
{
while(j>=0)
{
nums1[dest--]=nums2[j--];
}
}
}
189. 轮转数组
先局部逆序,再整体逆序
void reverse(int n1, int n2, int* nums)
{
while(n1<n2)
{
int tmp=nums[n1];
nums[n1++]=nums[n2];
nums[n2--]=tmp;
}
}
void rotate(int* nums, int numsSize, int k){
if(k>numsSize)
{
k=k%numsSize;
}
reverse(0,numsSize-1-k, nums);
reverse(numsSize-k, numsSize-1, nums);
reverse(0, numsSize-1, nums);
}
989. 数组形式的整数加法
- 这题不能直接算出相加结果,会超出范围,long long 也不行,
- 使用逐位相加法,大于等于10向前进一同时减去10,
int* ret = malloc(sizeof(int) * fmax(10, numSize + 1));
*returnSize=0;
for(int i=numSize-1;i>=0;i--)
{
int sum=num[i]+k%10;
k/=10;
if(sum>=10)
{
sum-=10;
k++;
}
ret[(*returnSize)++]=sum;
}
while(k)
{
ret[(*returnSize)++]=k%10;
k/=10;
}
int n1=0;
int n2=*returnSize-1;
while(n1<n2)
{
int tmp=ret[n1];
ret[n1++]=ret[n2];
ret[n2--]=tmp;
}
return ret;
}