数据结构与算法——顺序表期末复习五大经典题型

目录

 一:顺序表-移除元素

二:顺序表-删除有序数组中的重复项

三:顺序表-合并两个有序数组

四:顺序表-旋转数组

五:顺序表-数组形式的整数加法


 一:顺序表-移除元素

题型链接:27. 移除元素 - 力扣(LeetCode)

题目要求:原地移除数组中所有的元素val,要求时间复杂度为O(N),空间复杂度为O(1)

以 【 nums = [0,1,2,2,3,0,4,2], val = 2 】为例:

 

解答步骤: 

int removeElement(int* nums, int numsSize, int val) {
    int i=0,j=0;
    for(i=0,j=0;j<numsSize;)
    {
        if(nums[j]==val)
        {
            j++;
        }   
        else
        {
            nums[i++] = nums[j++];
        }
    }
    return i;
}

二:顺序表-删除有序数组中的重复项

题型链接:26. 删除有序数组中的重复项 - 力扣(LeetCode)

题目要求:删除排序数组中的重复项

以【 nums = [0,0,1,1,1,2,2,3,3,4]  】为例:

解答步骤:

int removeDuplicates(int* nums, int numsSize) {
    int i=0,j=0;
    for(i=0,j=0;j<numsSize;)
    {
        if(nums[i]==nums[j])
        {
            j++;
        }
        else
        {
            nums[++i] = nums[j++];
        }
    }
    return i+1;
}

三:顺序表-合并两个有序数组

题型链接:88. 合并两个有序数组 - 力扣(LeetCode)

题目要求:合并两个有序数组

解题思路:从后往前大小比较法

以【 nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 】为例:

解答步骤:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int end1 = m-1;
    int end2 = n-1;
    int end = m+n-1;

    while(end1>=0 && end2>=0)
    {
        if(nums1[end1]<nums2[end2])
        {
            nums1[end--] = nums2[end2--];
        }
        else
        {
            nums1[end--] = nums1[end1--];
        }
    }
    while(end2>=0)
    {
        nums1[end--] = nums2[end2--];
    }
}

四:顺序表-旋转数组

题型链接:189. 轮转数组 - 力扣(LeetCode)

题目要求:将数组旋转

解题思路:三段逆置法

向右轮转k个位置:

  1. 先将整个数组进行逆置。
  2. 再将【0,k-1】范围内的数组逆置
  3. 最后【k,numsSize-1】范围内的数组逆置

解答步骤:

//逆序
void Reverse(int* a,int left,int right)
{
    while(left<right)
    {
        int tmp = a[left];
        a[left]= a[right];
        a[right] = tmp;

        ++left;
        --right;
    }

}

void rotate(int* nums, int numsSize, int k) {
    k %= numsSize;
    Reverse(nums,0,numsSize-1);
    Reverse(nums,0,k-1);
    Reverse(nums,k,numsSize-1);
}

五:顺序表-数组形式的整数加法

题型链接:989. 数组形式的整数加法 - 力扣(LeetCode)

题目要求:数组形式的整数加法

解题思路:

  1. 先得到的所求的逆序数组
  2. 再将其逆置转换过来

解答步骤:

int* addToArrayForm(int* num, int numSize, int k, int* returnSize) {

    int* tmp = (int*)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)
        {
            k++;
            sum -= 10;
        }
        tmp[(*returnSize)++] = sum;
    }

    for(; k>0; k/=10)
    {
        tmp[(*returnSize)++] = k%10;
    }

    for(int i=0; i<(*returnSize)/2; i++)
    {
        int ret = tmp[i];
        tmp[i] = tmp[(*returnSize)-1-i];
        tmp[(*returnSize)-1-i] = ret;
    }

    return tmp;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值