【数据结构】顺序表练习题

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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值