• 顺序表在线OJ题(详解+图解)


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

    在这里插入图片描述
    在这里插入图片描述
    题目的大概意思是:用户自行输入一个数组,还要输入一个val的整形值,然后从数组中移除等于val的元素
    我们根据题目的要求,时间复杂度为O(N)空间复杂度为O(1)
    可以用以下的办法:
    用一个for循环将数组遍历,再用if语句进行判断,如果不等于val的值,我们就将这个元素放入数组中,如果等于val的话i就继续+1,不放入数组中
    在这里插入图片描述
    代码实现如下:

    int removeElement(int* nums, int numsSize, int val)
    {
        int i = 0;
        int pos = 0;
        int ret=0;
        for (i = 0; i < numsSize; i++)
        {
            if (nums[i] != val)
            {
                nums[pos] = nums[i];
                pos++;
                ret++;
            }
        }
        return ret;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    2:删除排序数组中的重复项

    在这里插入图片描述
    在这里插入图片描述
    题目的要求是删除数组中的重复项,使其只出现一次,然后返回整个数组,并按照它们最初在 nums 中出现的顺序排列,并且输出数组的大小
    这题我们可以使用双指针的思路来解决:
    用while循环遍历,如果nums[src]!=nums[dst],nums[1](也就是nums[++dst])就等于nums[src],然后dst和src依次++,如果nums[src]=nums[dst]的话,src就直接++,dst不用++
    在这里插入图片描述
    代码实现如下:

    int removeDuplicates(int* num, int numsSize)
    {
        int src = 1;
        int dst = 0;
        while (src < numsSize)
        {
            if (num[src] != num[dst])
            {
                num[++dst] = num[src++];
            }
            else
                src++;
        }
        return dst + 1;//返回数组的大小
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    3:合并两个有序数组

    在这里插入图片描述
    本题是将两个有序的数组最后合并为一个有序数组,然后返回,我们可以先将数组nums2放入nums1中,然后再将nums1进行一次排序,然后返回nums1
    在这里插入图片描述
    代码实现如下:

    void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
    {
    //直接用qsort排序
        //int i = 0;
        //int pos = 0;
        //for (i = 0; i < n; i++)
        //{
        //    nums1[m + i] = nums2[pos++];
        //}
        //qsort(nums1, nums1Size, sizeof(int), cmp);
        //这种方法也比较简单,是将两个数组中末位的元素进行比较
        int end1 = m - 1;
        int end2 = n - 1;
        int i = m + n - 1;
        while (end1 >= 0 && end2 >= 0)
        {
            if (nums1[end1] >= nums2[end2])
            {
                nums1[i--] = nums1[end1--];
            }
            else
            {
                nums1[i--] = nums2[end2--];
            }
        }
        while (end2 >= 0)
        {
            nums1[i--] = nums2[end2--];
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    4:旋转数组

    在这里插入图片描述
    这个题目算是很简单的,在我之前的文章中也讲解过,所以这里不做过多的解释了
    代码如下:
    大致的思路就是先将前k个元素旋转,然后旋转后一部分,然后再整体旋转

    void swap(int* a, int* b)
    {
        int t = *a;
        *a = *b, *b = t;
    }
    
    void reverse(int* nums, int start, int end) 
    {
        while (start < end) 
        {
            swap(&nums[start], &nums[end]);
            start += 1;
            end -= 1;
        }
    }
    
    void rotate(int* nums, int numsSize, int k) 
    {
        k %= numsSize;
        if( k ==0 || numsSize == 1)
        {
            return;
        }
        
        //交换高到低
        reverse(nums, 0, k - 1);
    
        //交换低到高
        reverse(nums, k, numsSize - 1);
    
         //交换全部
        reverse(nums, 0, numsSize - 1);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    5:数组形式的整数加法

    在这里插入图片描述
    本题的思路如下:
    我们的函数参数有num数组,就是我们输入的数组,numsize是num数组的元素个数,k是加上去的值,returnsize是最后加上k后的数组
    思考后我们就可以得出以下思路:
    在这里插入图片描述

    代码如下:

    int* addToArrayForm(int* num, int numSize, int k, int* returnSize)
    {
        int i=0;
        int sum=0;
        int x=pow(10,numSize-1);
        for(i=0;i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    好了,今天的分享到这里就结束了,感谢大家的支持!

  • 相关阅读:
    成都瀚网科技有限公司:怎么优化抖店体验分?
    SpringCloud之Sentinel入门
    java面试题(一年工作经验)的心得
    Jackson @JsonProperty重复字段处理
    iOS Swift5 视频播放 能播放各种编码格式的视频的第三方库
    全网独家·首发2022年100家公司真实的面试题笔试题汇总
    (十四)devops持续集成开发——jenkins流水线使用pipeline方式发布项目
    什么品牌的蓝牙耳机音质最好?音质好的蓝牙耳机推荐
    【Leetcode】水题-面试题 01.03. URL化
    编译原理13:SLR(1)分析表、LR(1)分析表
  • 原文地址:https://blog.csdn.net/weixin_63966442/article/details/134438983