C语言作业笔记

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;elsereturn 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 hereint 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.mzph.cn/news/866013.shtml

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

相关文章

关于5G和卫星

手机&#xff0c;已经串联起了我们生活中的一切环节。我们随时随地拿出手机&#xff0c;都能畅快地上网。 这一切是如此地理所当然&#xff0c;以至于我们甚至想不到这样不可思议的问题&#xff1a; 移动通信网络真的无处不在吗&#xff1f; 我们都知道&#xff0c;地球虽叫…

毕业论文初稿写作方法与过程

毕业论文初稿写作方法与过程 毕业论文是大学生在学业结束前必须完成的一项重要任务&#xff0c;它不仅是对学生所学知识的综合运用&#xff0c;也是对学生研究能力和写作能力的检验。写好毕业论文初稿是完成高质量毕业论文的关键一步。下面将具体阐述毕业论文初稿的写作方法和过…

Redis 7.x 系列【18】事务

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 命令2.1 MULTI2.2 EXEC2.3 DISCARD2.4 WATCH2.5 UNWATCH 3. 事务中的错误4.…

无法识别为 cmdlet、函数、脚本文件或可运行程序的名称

一、遇到问题 PS D:\software\nacos\nacos-server-2.3.1\bin> startup.cmd -m standalone startup.cmd : 无法将“startup.cmd”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c; 请确保路径正确&#xff0c;然后…

Ubuntu su命令输入密码后提示“su: 认证失败”

在Ubuntu系统中&#xff0c;使用su命令切换到root用户时提示“su: 认证失败”通常是因为root账户默认情况下是被锁定的&#xff0c;没有设置密码。以下是一些解决这个问题的方法&#xff1a; 使用sudo命令&#xff1a;Ubuntu推荐使用sudo命令代替直接使用root用户。sudo命令允许…

Aavegotchi的Gotchiverse新地图: 沉睡的野兽即将苏醒!

Gotchi 守护者们&#xff0c;准备好了&#xff0c;因为我们要大开杀戒了&#xff01; 加入我们吧&#xff08;后果自负&#xff01;&#xff09;&#xff0c;我们将深入Gotchiverse&#xff0c;前往奥姆夫山--我们虚拟世界中所有 FOMO 的炽热源头。 请继续阅读&#xff0c;了解…

AI 绘画的常用技巧和操作方法

随着人工智能技术的飞速发展&#xff0c;AI 绘画已经成为设计和艺术领域的一股新兴力量。无论是设计师、艺术家&#xff0c;还是普通的科技爱好者&#xff0c;都能通过 AI 绘画工具创造出令人惊叹的作品。 AI 绘画的基本原理 AI 绘画的核心在于机器学习算法。通过训练大量的图像…

餐饮界的新传奇:沃可趣员工社区,让品牌关怀在指尖流淌

咖啡师与顾客发生肢体冲突、员工用咖啡粉泼顾客……某精品咖啡一天爆出两个大瓜&#xff01; 很快有网友指出咖啡店员工长期遭受重压&#xff0c;与品牌之间存在根本矛盾。 同样做餐饮的老牌快餐&#xff0c;门店密度与之不相上下&#xff0c;却很少发生这样的暴雷。 不仅因…

算法力扣刷题 三十一【150. 逆波兰表达式求值】

前言 栈和队列篇。 记录 三十一【150. 逆波兰表达式求值】 一、题目阅读 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。 每个操作…

Django创建项目(1)

运行 注意 在本次创建Django项目时&#xff0c;出现了一点小问题&#xff0c;由于我之前pip换源过&#xff0c;换源用的是http&#xff0c;结果在创建时&#xff0c;pip只支持https&#xff0c;所以如果出现创建项目失败的问题&#xff0c;那么有可能是因为换源的问题&#xf…

(三十一)Flask之wtforms库【剖析源码下篇】

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

AlphaGo 背后的人工智能:机器学习和神经网络

文章目录 一、说明二、背景三、围棋游戏四、AlphaGo 算法五、神经网络六、AlphaGo 的未来七、人工智能的未来八、结论 一、说明 棋盘游戏围棋被视为人工智能最具挑战性的任务之一&#xff0c;因为它“复杂、基于模式且难以编程”。计算机程序 AlphaGo 战胜李世石成为人工智能和…

Redis 五大数据类型底层原理

0、前言 本文涉及的主题&#xff1a; redis 对象存储 底层数据结构&#xff1a;int、embstr、raw、ziplist、listpack、quicklist、skiplist、intset、hashtable redis 数据类型&#xff1a;string、list、set、zset、hash 1、对象存储、底层编码、数据类型 1.1 对象存储…

14-23 深度神经网络的主要架构(RNN/LSTM/CNN)

神经网络架构 神经网络的架构决定了这些网络如何运行&#xff0c;这是执行各种任务和扩展神经网络应用的关键因素&#xff0c;主要有两种方法&#xff1a;前馈神经网络和反馈神经网络。在本文中&#xff0c;在彻底分析每种方法之后&#xff0c;我们将对这两种架构进行深入比较…

规则·理解·成长:与自闭症儿童共绘记忆蓝图

在星贝育园&#xff0c;作为专注于自闭症儿童康复的专业教育者&#xff0c;我们常常遇到家长的疑惑&#xff1a;“为什么我的孩子总是记不清楚规则&#xff1f;”这个问题触及了自闭症谱系障碍&#xff08;ASD&#xff09;儿童在理解与遵守规则方面面临的独特挑战。下面&#x…

每日一题——Python实现PAT乙级1005 继续(3n+1)猜想(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码逻辑概述 时间复杂度分析 空间复杂度分析 总结 我要更强 代码优化点…

【MySQL基础篇】函数及约束

1、函数 函数是指一段可以直接被另一段程序程序调用的程序或代码。 函数 - 字符串函数 MySQL中内置了很多字符串函数&#xff0c;常用的几个如下&#xff1a; 函数功能CONCAT(S1,S2,...,Sn)字符串拼接&#xff0c;将S1,S2,...,Sn拼接成一个字符串LOWER(str)将字符串str全部…

【热部署】✈️Springboot 项目的热部署实现方式

目录 &#x1f378;前言 &#x1f37b;一、热部署和手动重启 &#x1f37a;二、热部署的实现 2.1 手动启动热部署 2.2 自动检测热部署 2.3 关闭热部署 &#x1f49e;️三、章末 &#x1f378;前言 小伙伴们大家好&#xff0c;书接上文&#xff0c;通过Springboot 中的 actu…

提升TK直播体验:使用美国直播网络的六大优势

国内有许多公司想在TikTok上进行美国直播&#xff0c;但由于TikTok的政策限制&#xff0c;在国内直接访问存在困难。然而&#xff0c;通过使用Ogcloud的美国直播网络&#xff0c;这一问题得以解决。那么&#xff0c;TikTok海外直播使用美国直播网络具体有哪些优势呢&#xff1f…

【懒删除堆 优先队列】1172. 餐盘栈

本文涉及知识点 懒删除堆 优先队列 LeetCode1172. 餐盘栈 我们把无限数量 ∞ 的栈排成一行&#xff0c;按从左到右的次序从 0 开始编号。每个栈的的最大容量 capacity 都相同。 实现一个叫「餐盘」的类 DinnerPlates&#xff1a; DinnerPlates(int capacity) - 给出栈的最大…