C语言作业笔记

news2024/12/30 3:01:28

1.

要找俩个数使其相加等于一个数,那么俩个数从头尾出发,先动一边,假设是尾先动,一开始俩个数相加大于sum(小于的话就动头),那么总有一时刻俩数相加小于sum,则就在那一刻停下来,然后动头那一边去逼近sum,最坏情况就是俩个数字相遇了,时间复杂度就为O(N)

2.

可以通过一直替换T(n-1)使其变成常数,每次降低一次就为有里面减一到外面来,因为时间复杂度看的是最大级,所以是0(N)

3 .

思路一:

在开俩个数组去存放数据,一个存放k个,一个存放numsSize-k个,先把它们分隔开,然后再都放进原来的数组里,就可以达到要求 

代码实现:

void rotate(int* nums, int numsSize, int k) {
    int k1=k%numsSize;
    int* a=(int*)malloc(sizeof(int)*(numsSize-k1));
    int* b=(int*)malloc(sizeof(int)*k1);
    for(int i=0;i<numsSize-k1;i++)
    {
        a[i]=nums[i];
    }
    for(int j=0;j<k1;j++)
    {
        b[j]=nums[numsSize-k1+j];
    }
    for(int z=0;z<k1;z++)
    {
        nums[z]=b[z];
    }
    for(int t=0;t<numsSize-k1;t++)
    {
        nums[t+k1]=a[t];
    }
}

思路二:

先转置整个数组数字,然后在转置k-1个元素,最后转置k到numsSize的数组数字,这样就调换了以k分成俩边数组的位置

代码实现:

void reverse(int* nums, int begin, int end)
{
    while (begin < end)
    {
        int tmp = nums[begin];
        nums[begin] = nums[end];
        nums[end] = tmp;

        ++begin;
        --end;
    }
}

// 三趟逆置倒的思路
void rotate(int* nums, int numsSize, int k) {
    if (k > numsSize)
    {
        k %= numsSize;
    }

    reverse(nums, 0, numsSize - 1);
    reverse(nums, 0, k - 1);
    reverse(nums, k, numsSize - 1);
}

4.

思路:

要找到确失的数字,可以把这个数全部加起来,然后再重新创建一个不却数字的数组,把这个也加起来,然后俩个相减,得到值就是缺少的值

代码实现:

int missingNumber(int* nums, int numsSize){
    int b=0;
    int c=0;
    int* a=(int*)malloc(sizeof(int)*(numsSize+1));
    for(int i=0;i<=numsSize;i++)
    {
        a[i]=i;
    }
   for(int i=0;i<numsSize;i++)
   {
        b+=nums[i];
   }
   for(int i=0;i<=numsSize;i++)
   {
        c+=a[i];
   }
   return c-b;
}

5.

 

思路一:

总数-k为正数第几个,把总数算出来在和k相减就可以知道在哪一个位置

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
int gettree(struct ListNode* head)
{
    int size=0;
    while(head)
    {
        head=head->next;
        size++;
    }
    return size;
}

int kthToLast(struct ListNode* head, int k){
    struct ListNode* cur=head;
    int a=gettree(head);
    int c=a-k;
    while(c--)
    {
        cur=cur->next;
    }
    return cur->val;
}

 思路二:

快慢指针,先让fast走k步后,让fast和slow一起走,slow一共会走(总数-k)步,也可以走到对应位置

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        struct ListNode* slow = pListHead;
        struct ListNode* fast = slow;
        while (k--)
        {
            if (fast)
                fast = fast->next;
            else
                return NULL;
        }

        while (fast)
        {
            slow = slow->next;
            fast = fast->next;
        }

        return slow;
    }
};

6.

 

思路 1:

快慢指针,先找到中间结点,然后逆置中间后面的结点,最后跟前半部分对比

代码实现:

这一步是找中间结点

while(fast&&fast->next)
        {
            slow=slow->next;
            fast=fast->next->next;
        }

这一步是逆置中间后面的结点,然后把连接方向改变

ListNode* cur=NULL;
        ListNode* next=A;
        while(slow)
        {
            next=slow->next;
            slow->next=cur;
            cur=slow;
            slow=next;
        }

 把前半部分和后半部分进行对比

next=A;
        while(cur)
        {
            if(next->val!=cur->val)
            {
                return false;
            }
            next=next->next;
            cur=cur->next;
        }
        return true;

 总代码:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        ListNode* fast=A;
        ListNode* slow=A;
        while(fast&&fast->next)
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        ListNode* cur=NULL;
        ListNode* next=A;
        while(slow)
        {
            next=slow->next;
            slow->next=cur;
            cur=slow;
            slow=next;
        }

        next=A;
        while(cur)
        {
            if(next->val!=cur->val)
            {
                return false;
            }
            next=next->next;
            cur=cur->next;
        }
        return true;
    }
};

思路二:

可以把值都放进数组里面,但是如果题目没告诉链表最大值就不能使用这个方法

放进数组后,把头尾的值取出来进行对比,一直往中间

代码实现:

class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        // write code here
        int a[900] = { 0 };
        ListNode* cur = A;
        int n = 0;
        //保存链表元素
        while (cur)
        {
            a[n++] = cur->val;
            cur = cur->next;
        }
        //判断数组是否为回文结构
        int begin = 0, end = n - 1;
        while (begin < end)
        {
            if (a[begin] != a[end])
                return false;
            ++begin;
            --end;
        }

        return true;
    }
};

7.

思路:

因为俩个链表长度有可能不一样长,所以需要让长的链表先走,使得出发时俩个俩个链表等长, 就可以找到最后一个相等的结点(不是找第一个相等的而是找最后一个)

代码实现:

计算俩个链表计数

    int a=0;
    int b=0;
    struct ListNode* aa=headA;
    struct ListNode* bb=headB;
    while(aa)
    {
        a++;
        aa=aa->next;
    }
    while(bb)
    {
        b++;
        bb=bb->next;
    }

 找到俩个链表的长的哪一个,可以用假设法,可以节省很多步骤,先假设1大2小,不是就调整,非常方便

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    int a=0;
    int b=0;
    struct ListNode* aa=headA;
    struct ListNode* bb=headB;
    while(aa)
    {
        a++;
        aa=aa->next;
    }
    while(bb)
    {
        b++;
        bb=bb->next;
    }
    int c=a-b>0?a-b:b-a;
    struct ListNode* long1=headA;
    struct ListNode* short1=headB;
    if(a<b)
    {
        long1=headB;
        short1=headA;
    }
    while(c--)
    {
        long1=long1->next;
    }
    while(short1&&long1)
    {
        if(short1==long1)
        {
            return long1;
        }
        else
        {
            long1=long1->next;
            short1=short1->next;
        }
    }
    return NULL;
}

 8.

 

 思路:

因为要复制出一个与原链表一样的东西出来,所以可以在每个结点后面跟一个新结点

代码实现:

1.创建新结点连在原链表的后面,并把val值也复制过去

 struct Node* cur=head;
	while(cur)
    {
        struct Node* copy=(struct Node*)malloc(sizeof(struct Node));
        copy->val=cur->val;
        copy->next=cur->next;
        cur->next=copy;
        cur=copy->next;
    }

2 .把random的也复制过去

cur=head;
    struct Node* copyhead=NULL;
    struct Node* copytail=NULL;
    while(cur)
    {
        struct Node* copy=cur->next;
        struct Node* next=copy->next;
        if(cur->random==NULL)
        {
            copy->random=NULL;
        }
        else
        {
            copy->random=cur->random->next;
        }
        cur=next;
    }

3.把复制的链表从原链表上拆下来


    cur=head;
    while(cur)
    {
        struct Node* copy=cur->next;
        struct Node* next=copy->next;
        if(copytail==NULL)
        {
            copyhead=copytail=copy;
        }
        else
        {
            copytail->next=copy;
            copytail=copytail->next;
        }
        cur->next=next;
        cur=next;
    }
    return copyhead;
/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */

struct Node* copyRandomList(struct Node* head) {
    struct Node* cur=head;
	while(cur)
    {
        struct Node* copy=(struct Node*)malloc(sizeof(struct Node));
        copy->val=cur->val;
        copy->next=cur->next;
        cur->next=copy;
        cur=copy->next;
    }
    cur=head;
    struct Node* copyhead=NULL;
    struct Node* copytail=NULL;
    while(cur)
    {
        struct Node* copy=cur->next;
        struct Node* next=copy->next;
        if(cur->random==NULL)
        {
            copy->random=NULL;
        }
        else
        {
            copy->random=cur->random->next;
        }
        cur=next;
    }

    cur=head;
    while(cur)
    {
        struct Node* copy=cur->next;
        struct Node* next=copy->next;
        if(copytail==NULL)
        {
            copyhead=copytail=copy;
        }
        else
        {
            copytail->next=copy;
            copytail=copytail->next;
        }
        cur->next=next;
        cur=next;
    }
    return copyhead;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1893310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL高可用(MHA高可用)

什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大…

机器学习与模式识别_清华大学出版社

contents 前言第1章 绪论1.1 引言1.2 基本术语1.3 假设空间1.4 归纳偏好1.5 发展历程1.6 应用现状 第2章 模型评估与选择2.1 经验误差与过拟合2.2 评估方法2.3 性能度量2.3.1 回归任务2.3.2 分类任务 2.4 比较检验2.5 偏差与方差2.5.1 偏差-方差分解2.5.2 偏差-方差窘境 第3章 …

In Ictu Oculi: Exposing AI Created Fake Videos by Detecting Eye Blinking

文章目录 In Ictu Oculi: Exposing AI Created Fake Videos by Detecting Eye Blinking背景关键点内容预处理Long-Term Recurrent CNNsLSTM-RNN模型训练实验data启示In Ictu Oculi: Exposing AI Created Fake Videos by Detecting Eye Blinking 会议:2018 IEEE International…

用Vue3和Rough.js绘制一个交互式3D图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于Rough.js和GSAP创建交互式SVG图形卡片 应用场景 本代码适用于需要创建动态交互式SVG图形卡片的场景&#xff0c;例如网页设计、数据可视化和交互式艺术作品。 基本功能 该代码利用Rough.js和GSAP库&…

数据分析入门指南:从基础概念到实际应用(一)

随着数字化时代的来临&#xff0c;数据分析在企业的日常运营中扮演着越来越重要的角色。从感知型企业到数据应用系统的演进&#xff0c;数据驱动的业务、智能优化的业务以及数智化转型成为了企业追求的目标。在这一过程中&#xff0c;数据分析不仅是技术的运用&#xff0c;更是…

在 PostgreSQL 中强制执行连接顺序#postgresql认证

让我们首先创建一些表&#xff1a; PgSQL plan# SELECT CREATE TABLE x || id || (id int) FROM generate_series(1, 5) AS id;?column? --------------------------CREATE TABLE x1 (id int)CREATE TABLE x2 (id int)CREATE TABLE x3 (id int)CREATE TABLE…

Richtek立锜科技车规级器件选型

芯片按照应用场景&#xff0c;通常可以分为消费级、工业级、车规级和军工级四个等级&#xff0c;其要求依次为军工>车规>工业>消费。 所谓“车规级元器件”--即通过AEC-Q认证 汽车不同于消费级产品&#xff0c;会运行在户外、高温、高寒、潮湿等苛刻的环境&#xff0c…

首获IF就高达13分!各刊潜力无限——爱思唯尔2024首获IF期刊大盘点!

【SciencePub学术】爱思唯尔&#xff08;Elsevier&#xff09;是一家全球知名的国际性学术出版公司&#xff0c;总部位于荷兰阿姆斯特丹。该公司主要出版科学、技术和医学领域的学术期刊和书籍&#xff0c;涵盖了广泛的学科领域&#xff0c;如生命科学、物理科学、社会科学等。…

Python面向对象编程中的继承及其应用

目录 1. 继承的基本概念 2. 继承的语法 3. 继承的应用场景 4. 使用示例&#xff1a;汽车销售系统 5. 总结 继承是面向对象编程中的一个重要概念&#xff0c;它允许我们根据已有类创建新类&#xff0c;并继承已有类的属性和方法。在本文中&#xff0c;我们将学习Python中的…

c++习题09-分离整数的各个数

目录 一&#xff0c;题目 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;题目 二&#xff0c;思路 一开始我想到的是将简单容易输出的1000以内的数先进行相应的运算&#xff0c;再输出之后再对1000以上的数字进行判断&#xff08;主要还是想先将很大的数变小&#x…

Java数字化产科管理系统源码,多家医院应用案例,可直接上项目

Java数字化产科管理系统源码&#xff0c;多家医院应用案例&#xff0c;可直接上项目 数字化产科管理平台系统是什么&#xff1f;该系统由产品包涵门诊管理、住院管理、统计管理、移动服务四大模块&#xff0c;新版本涵盖围产全过程&#xff0c;从建档、首检、复检、住院(待产、…

防爆智能手机如何解决危险环境下通信难题?

在化工厂、石油行业、矿山等危险环境中&#xff0c;通信安全一直是难题。传统手机因不具备防爆功能&#xff0c;可能引发火花、爆炸等安全风险&#xff0c;让工作人员在关键时刻难以及时沟通。但如今&#xff0c;防爆智能手机的出现彻底改变了这一现状&#xff01; 安全通信&am…

【WebGIS干货分享】Webgis 面试题-浙江中海达

1、Cesium 中有几种拾取坐标的方式&#xff0c;分别介绍 Cesium 是一个用于创建 3D 地球和地理空间应用的 JavaScript 库。在 Cesium 中&#xff0c;你可以使用不同的方式来拾取坐标&#xff0c;以便与地球或地图上的对象进行交 互。以下是 Cesium 中几种常见的拾取坐标的方式…

静态路由的配置

5.3静态路由 静态路由由网络管理员手动配置&#xff0c;配置方便&#xff0c;对系统要求低&#xff0c;适用于拓扑结构简单并且稳定的小型网络。缺点是不能自动适应网络拓扑的变化&#xff0c;需要人工干预。 5.3.1静态路由实验 1、实验需求 ① 掌握路由表的概念&#xff1…

服务器上VMWare Workstation虚拟机声卡支持

问题&#xff1a;联想服务器没有声卡&#xff0c;Windows 服务器安装了VMWare Workstation&#xff0c;里面的Windows 11虚拟机&#xff0c;我远程桌面上来&#xff0c;没有声卡&#xff0c;但是我想做 声音方面的测试就没办法。 解决办法&#xff1a; 服务器主机上安装虚拟机…

【3分钟准备前端面试】vue3

目录 Vue3比vue2有什么优势vue3升级了哪些重要功能生命周期变化Options APIComposition APIreftoRef和toRefstoReftoRefsHooks (代码复用)Vue3 script setupsetupdefineProps和defineEmitsdefineExposeVue3比vue2有什么优势 性能更好体积更小更好的TS支持更好的代码组织更好的逻…

CAAC无人机执照:视距内驾驶员与超视距驾驶员区别详解

CAAC无人机执照中的视距内驾驶员与超视距驾驶员在多个方面存在显著的区别。以下是详细的对比和解释&#xff1a; 1. 定义与操作范围&#xff1a; - 视距内驾驶员&#xff08;驾驶员证&#xff09;&#xff1a;操作无人机时&#xff0c;无人机必须在操控员的视线范围内&#xff…

什么是JavaScript中的箭头函数(arrow functions)?

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介什么是JavaScript中的箭头函数&#xff08;arrow functions&#xff09;&#xff1f;1. 引言2. 箭头函数的语法2.1 基本语法2.2 示例 3. 箭头函数的特点3.1 简洁的语法3.2 没有this绑定3.3 不能用作构造函数3.4 没有arguments对象3…

二百四十二、Hive——Hive的动态分区表出现day=__HIVE_DEFAULT_PARTITION__分区

一、目的 Hive的DWD层动态分区表的分区出现day__HIVE_DEFAULT_PARTITION__&#xff0c;有点懵&#xff0c;而且表中数据的day字段也显示__HIVE_DEFAULT_PARTITION__ 1、DWD层动态分区表的分区 __HIVE_DEFAULT_PARTITION__ 2、DWD层分区字段day数据 __HIVE_DEFAULT_PARTITION…

Java项目总结3

1.抽象类与抽象方法 注意&#xff1a; 抽象类不能实例化 抽线类中不一定有抽i像方法&#xff0c;有抽象方法的类一定是抽象类 可以有构造方法 抽象类的子类要么重写抽象类中的所有抽象方法&#xff0c;要么是抽象类 抽象类的作用&#xff1a; 抽取共性时&#xff0c;无法确定方…