【LeetCode】力扣题——轮转数组、消失的数字、数组串联

个人主页:艾莉丝努力练剑

❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训

学习方向:C/C++方向

⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平



前言:牛客网和LeetCode的刷题都不可或缺,我们都做一做,力扣的题目对提升代码能力很有帮助,需要有一点基础,几乎都是接口型的题目,在C语言刷题专栏我好像还没有介绍过这两者的区别,那么我们来了解一下——IO型和接口型都是在线OJ的编程形式,区别在于:IO型:输入输出格式处理,又被称为输入输出型;

接口型:特定功能模块的逻辑实现,又被称为函数实现型。

解释一下,IO型就是输入输出要程序员自己写,接口型则不需要。 


目录

正文

一、用数组逆置方法求解轮转数组

二、malloc实现数组串联

三、异或方法求解消失的数字

结尾


正文

每一道题,博主都在力扣网站写了题解,博主会把网址放到每个版块开头。

一、用数组逆置方法求解轮转数组

189. 轮转数组 - 力扣(LeetCode)

这道题是我们的老熟人了,我在介绍数据结构与算法中的算法复杂度一文中就分三种思路介绍过轮转数组这道题了,所以在本文中博主就不赘述了,直接上链接!

【数据结构】详解算法复杂度:时间复杂度和空间复杂度

思路

你选用何种方法解题?数组逆置

解题过程

这些方法具体怎么运用?先逆置后k次,再逆置前nums-k次,最后再整体逆置

复杂度

  • 时间复杂度:O(n) 
  • 空间复杂度:O(1)

代码演示——

// void my_reverse(int*nums,int left,int right)
// {
//     while(left < right)
//     {
//         int tmp = nums[left];
//         nums[left] = nums[right];
//         nums[right] = tmp;

//         left++;
//         right--;
//     }
// }

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

void my_reverse(int*nums,int left,int right)
{
    while(left < right)
    {
        int tmp = nums[left];
        nums[left] = nums[right];
        nums[right] = tmp;

        left++;
        right--;
    }
}

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

二、malloc实现数组串联

1929. 数组串联 - 力扣(LeetCode)

思路

你选用何种方法解题?malloc开辟空间,for循环遍历数组

解题过程

这些方法具体怎么运用?malloc开辟大小为numsSize*sizeof(int)*2的空间,再强制类型转换,for循环遍历数组,用题目所给的串联数组关系,就可以了

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

代码演示——

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* getConcatenation(int* nums, int numsSize, int* returnSize) 
{
    int *ans = (int *)malloc(numsSize*sizeof(int)*2);
    for(int i = 0;i < numsSize;i++)
    {
        ans[i] = nums[i];
        ans[i + numsSize] = nums[i];
    }
    *returnSize = numsSize * 2;
    return ans;
}

​

三、异或方法求解消失的数字

面试题 17.04. 消失的数字 - 力扣(LeetCode)

思路

你选用何种方法解题?异或

解题过程

这些方法具体怎么运用?for循环,然后异或,因为异或是相同为0,相异为1,我们就可以这么想——数组中的数依次跟0-N的所有数异或,最后剩下的那个数字就是缺的那个数字

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
​int missingNumber(int* nums, int numsSize) 
{
    int x = 0;
    for(int i = 0;i < numsSize;++i)
    {
        x ^= nums[i];
    }
    for(int j = 0;j < numsSize + 1;++j)
    {
        x ^= j;
    }

​

结尾

结语:本篇文章到这里就结束了,大家一定要自己动手敲一敲,不敲的话容易忘记。

你可能感兴趣的:(LeetCode代码强化刷题,leetcode,算法,职场和发展,开发语言,c语言,学习)