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

简介: 顺序表在线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;
}
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;//返回数组的大小
}
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--];
    }
}
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);
}
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<numSize;i++)
    {
        sum+=num[i]*x;
        x=x/10;
    }
    int SUM=sum+k;
    int count=0;
    while(SUM)
    {
        count++;
        SUM/=10;
    }
    int y=pow(10,count-1);
    for(i=0;i<count;i++)
    {
        returnSize[i]=(sum+k)/y;
        y/=10;
    }
    return returnSize;
}

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

相关文章
|
5月前
|
机器学习/深度学习 算法 C语言
【C/数据结构与算法】:10道链表经典OJ
【C/数据结构与算法】:10道链表经典OJ
22 1
|
6月前
|
算法
详解单链表经典OJ题-2
详解单链表经典OJ题
34 2
|
6月前
|
存储
单链表在线OJ题(详解+图解)
单链表在线OJ题(详解+图解)
47 3
|
6月前
|
存储
单链表在线OJ题二(详解+图解)
单链表在线OJ题二(详解+图解)
31 1
|
6月前
|
存储 索引
链表(基础详解、实现、OJ笔试题)
链表(基础详解、实现、OJ笔试题)
|
6月前
|
索引
单链表经典OJ题(四)
单链表经典OJ题(四)
|
6月前
单链表经典OJ题(二)
单链表经典OJ题(二)
|
6月前
|
算法
【408数据结构与算法】—链栈的表示和实现(十一)
【408数据结构与算法】—链栈的表示和实现(十一)
|
存储 算法
代码随想录算法训练营第三天 | LeetCode 203. 移除链表元素、707. 设计链表、206. 反转链表
代码随想录算法训练营第三天 | LeetCode 203. 移除链表元素、707. 设计链表、206. 反转链表
98 0
|
缓存 算法 C语言
【数据结构与算法篇】栈与队列(详解)附加Leetcode经典笔试题
【数据结构与算法篇】栈与队列(详解)附加Leetcode经典笔试题
61 0