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;地球虽叫…

【QT】Qt智能指针QPointer、QSharedPointer、QWeakPointer、QScopedPointer

QPointer QPointer can only point to QObject instances. It will be automatically set to nullptr if the pointed to object is destroyed. It is a weak pointer specialized for QObject. QPointer只能指向QObject实例。如果指向的对象被销毁&#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;然后…

Mysql-SQL基础-通用语法与分类

SQL通用语法 SQL语句可以一行或多行书写&#xff0c;以分号作为结尾。 SQL语句可以使用空格、缩进来提高句子的可读性。 SQL语句不区分大小写&#xff0c;对于关键字建议使用大写。 单行注释&#xff1a; --或用#进行注释。 多行注释&#xff1a; /* 注释内容 */ SQL分类…

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;却很少发生这样的暴雷。 不仅因…

http 状态码主要有哪些?【面试】

HTTP 协议在互联网上用得特别广&#xff0c;在浏览网页的时候经常会碰到它的状态码。这状态码其实就是服务器给客户端请求的一个回应&#xff0c;通过它我们就能知道请求处理得怎么样了。 一、HTTP 协议的状态码类别 &#x1f4f1; 1xx &#xff0c;这是信息性状态码&#xf…

vue2由mapbox2升级为mapbox3遇到的矢量底图样式丢失问题解决办法

贴个群号 WebGIS学习交流群461555818&#xff0c;欢迎大家 心路历程 当vue2由mapbox2升级为mapbox3的时候&#xff0c;您可能会遇到以下的问题 所有的代码都没有改变&#xff0c;升级为mapbox3就会出现部分矢量底图样式丢失&#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框架从入…

HTML简化

1.删除所有属性 javascript - Remove all attributes - Stack Overflow function delAttribute(element) {while (element.attributes.length > 0)element.removeAttribute(element.attributes[0].name); } var table document.getElementsByTagName(table); for (var i…

Linux修改服务器hostname方法

为了更好的区分服务器的辨识度&#xff1a; 提示&#xff1a;要修改两个文件&#xff0c;单一的修改一个后续怕出现不可预知的问题 修改hostname文件命令如下&#xff1a; seven-71则是我要修改的新hostname名称&#xff0c;下面三条命令&#xff0c;按顺序执行即可 hostnam…

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

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

C++后端开发--网络编程基础

目录 一、网络编程基础概念 1.1 网络协议 1.2 IP地址和端口号 1.3 Socket 1.4 TCP协议的三次握手和四次挥手 TCP的三次握手 TCP的四次挥手 整个流程更通俗易懂 TCP 三次握手流程图 TCP 四次挥手流程图 1.5 详细介绍一下http协议 HTTP协议的主要特点 HTTP请求 HTT…

Redis 五大数据类型底层原理

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