【C语言练习】数组OJ题

这篇具有很好参考价值的文章主要介绍了【C语言练习】数组OJ题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.消失的数字

题目:
【C语言练习】数组OJ题,c语言,算法,数据结构

思路1:

数组是从0加到N,所以把0到N的数加起来减去数组中的值,结果就是消失的数字。时间复杂度为O(N)
代码:

int missingNumber(int* nums, int numsSize)
{
    int ret = (numsSize+1)*numsSize/2;//0到N的数相加
    int i=0;
    for(i=0;i<numsSize;i++)
    {
        ret-=nums[i];//减去数组中的值
    }
    return ret;//消失的数字
}

思路2:

采用单身狗思路(异或法)
从0到N的值是依次加1,数组中消失的数字唯一出现一次,其他的数字都是成对出现

代码:

int missingNumber(int* nums, int numsSize)
{
    int x=0;
    int i=0;
    for(i=0;i<=numsSize;i++)
    {
        x^=i;
    }
    for(i=0;i<numsSize;i++)
    {
        x^=nums[i];
    }
    return x;
}

二.移除元素

题目:
【C语言练习】数组OJ题,c语言,算法,数据结构
创建两个变量src和dest,让src去遍历数组(src的范围小于元素个数),如果数组中的元素与val相等,就跳过;否则赋给dest,然后两个再一起到下一个元素。src遍历完返回dest就是数组的新长度。
代码:

int removeElement(int* nums, int numsSize, int val)
{
    int dest = 0;
    int src = 0;
    while(src<numsSize)
    {
        if(val==nums[src])
        {
            src++;
        }
        else
        {
            nums[dest]=nums[src];
            dest++;
            src++;
        }
    }
    return dest;
}

三.轮转数组

题目:
【C语言练习】数组OJ题,c语言,算法,数据结构
构建一个逆置的函数(注意传参时参数要对应清楚)

1 2 3 4 5 6 7 原来的数组
7 6 5 4 3 2 1 先全部逆置
5 6 7 1 2 3 4 后逆置左边k个,右边numsSize-k个

得到的就是右轮转k个的数组

如果k大于numsSize,可以取模操作,除去重复的工作,效率更高

代码:

void test(int* nums,int left, int right)
{
   while(left<right)
   {
       int t=nums[left];
       nums[left]=nums[right];
       nums[right]=t;
       left++;
       right--;
   }
}
void rotate(int* nums, int numsSize, int k)
{
    if(k>numsSize)//除去重复操作
    {
        k%=numsSize;
    }
    test(nums,0,numsSize-1);//全部逆置
    test(nums,0,k-1);//逆置左边3个
    test(nums,k,numsSize-1);//逆置右边4个
    int i=0;
    for(i=0;i<numsSize-1;i++)
    {
        printf("%d,",nums[i]);
    }
}

四.删除有序数组中的重复项

题目:
【C语言练习】数组OJ题,c语言,算法,数据结构
先存放数组的第一个元素,然后定义一个遍历去遍历数组,只要是重复的数字就跳过,不重复就存放到数组中,每次存放有一个变量(k)加1,(比较的是当前遍历到的数组中的某个元素与前面刚存放到数组的元素)直到遍历完返回k+1(数组新长度的值

代码:

int removeDuplicates(int* nums, int numsSize)
{
    int src = 0;
    int k=0;
    nums[k]=nums[src];
    src++;
    while(src<numsSize)
    {
        if(nums[src]==nums[k])
        {
            src++;
        }
        else
        {
            k++;
            nums[k]=nums[src];
            src++;
        }
    }
    return k+1;
}

五.合并两个有序数组

题目:
【C语言练习】数组OJ题,c语言,算法,数据结构
注意:这题的要求有一点不一样,合并后的数组不是在函数里又创建一个,而是存储到nums1去。

所以这题可以使用一种方法:倒着比较,取大的依次往前插入
当某个数组的全部放完了,直接把另一个数组依次往前插入就行(如果是num1还有元素没放完就不需要,因为num1就是它自己,num2有多余的元素需要有这个条件)

代码:

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--]=nums1[end1--];
        }
        else
        {
            nums1[end--]=nums2[end2--];
        }
    }
    while(end2>=0)
    {
        nums1[end--]=nums2[end2--];
    }
}

【C语言练习】数组OJ题,c语言,算法,数据结构
感谢观看~文章来源地址https://www.toymoban.com/news/detail-665169.html

到了这里,关于【C语言练习】数组OJ题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构刷题】数组oj

    题目: https://leetcode.cn/problems/remove-element/ 写一段原地移除数组中所有的元素val,要求时间复杂度为O(N^2),空间复杂度为O(1)的代码实现: 思路:遇到这个val后面的元素往前面覆盖。 int main() { int nums[] = { 0, 1, 2, 2, 3, 0, 4, 2 }; int numsSize = sizeof(nums) / sizeof(nums[0]); int val = 2; 写一段原地移

    2024年02月14日
    浏览(32)
  • 头歌(C语言)-数据结构与算法-数组(共7关)

    任务描述 本关任务:将十个数进行从大到小的顺序进行排列。 相关知识(略) 编程要求 根据提示,在右侧编辑器 Begin-End 处补充代码。 输入 输入十个整数。 输出 以从大到小的顺序输出这个十个数。 测试说明 样例输入: 1 2 3 4 5 6 7 8 9 10 样例输出: 10 9 8 7 6 5 4 3 2 1 代码:

    2024年02月11日
    浏览(42)
  • 万字精讲——数据结构栈与队列必会OJ练习

    W...Y的主页 💕 代码库分享 😊 在之前的博客中,我们学习了栈与队列的基本内容,并且实现了栈与队列。今天我们进行刷题训练,走进栈与队列的世界中去感受一番!!! 目录 括号匹配问题  使用队列实现栈 用栈实现队列 设计循环队列 给定一个只包括  \\\'(\\\' , \\\')\\\' , \\\'{

    2024年02月10日
    浏览(48)
  • 数据结构与算法教程,数据结构C语言版教程!(第五部分、数组和广义表详解)五

    数组和广义表,都用于存储逻辑关系为“一对一”的数据。 数组存储结构,99% 的编程语言都包含的存储结构,用于存储不可再分的单一数据;而广义表不同,它还可以存储子广义表。 本章重点从矩阵的角度讨论二维数组的存储,同时讲解广义表的存储结构以及有关其广度和

    2024年01月23日
    浏览(50)
  • 数据结构与算法教程,数据结构C语言版教程!(第五部分、数组和广义表详解)三

    数组和广义表,都用于存储逻辑关系为“一对一”的数据。 数组存储结构,99% 的编程语言都包含的存储结构,用于存储不可再分的单一数据;而广义表不同,它还可以存储子广义表。 本章重点从矩阵的角度讨论二维数组的存储,同时讲解广义表的存储结构以及有关其广度和

    2024年01月21日
    浏览(48)
  • 数据结构:链表基础OJ练习+带头双向循环链表的实现

    目录 一.leetcode剑指 Offer II 027. 回文链表 1.问题描述 2.问题分析与求解 (1) 快慢指针法定位链表的中间节点 (2) 将链表后半部分进行反转 附:递归法反转链表 (3) 双指针法判断链表是否回文 二.带头双向循环链表的实现 1.头文件 2.节点内存申请接口和链表初始化接口 3.链表的打

    2024年02月02日
    浏览(51)
  • 【数据结构OJ题】删除有序数组中的重复项

    原题链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 用 双指针算法, 定义两个变量src和dst,一开始让src和dst指向num[ ]数组的第一个元素,再使用if语句判断。 如果nums[src]==nums[dst],就让src指向下一位,即src++。如果nums[src]!=

    2024年02月14日
    浏览(39)
  • C语言数据结构+KMP算法next数组优化计算方法+优化后子串匹配代码实现

    通过我之前那篇KMP算法的讲解,我们可以快速手算KMP算法的next数组,但是之前计算的next数组在一些情况下会有缺陷,比如模式串’aaaab’和主串’aaabaaaab’进行匹配 令模式串指针为j 当第一个元素不匹配时,下一次匹配还是要从模式串的第一个元素与主串匹配,其实我们可以直接写

    2024年02月06日
    浏览(54)
  • 数据结构:带环单链表基础OJ练习笔记(leetcode142. 环形链表 II)(leetcode三题大串烧)

    目录 一.前言  二.leetcode160. 相交链表  1.问题描述 2.问题分析与求解 三.leetcode141. 环形链表 1.问题描述 2.代码思路  3.证明分析  下一题会用到的重要小结论: 四.leetcode142. 环形链表 II 1.问题描述 2.问题分析与求解 Judgecycle接口: 方法一: 方法二:  单链表和带环单链表

    2023年04月08日
    浏览(40)
  • 【数据结构】二叉树OJ题(C语言实现)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年03月17日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包