大一上考核题解

文章目录

    • [238. 除自身以外数组的乘积](https://leetcode.cn/problems/product-of-array-except-self/)
        • 代码
        • 题解
    • [73. 矩阵置零](https://leetcode.cn/problems/set-matrix-zeroes/)
        • 代码
        • 题解
    • [394. 字符串解码](https://leetcode.cn/problems/decode-string/)
        • 代码
        • 题解
    • [23. 合并 K 个升序链表](https://leetcode.cn/problems/merge-k-sorted-lists/)
        • 代码
        • 题解
    • [232. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/)
        • 代码
        • 题解
    • [61. 旋转链表](https://leetcode.cn/problems/rotate-list/)
        • 代码
        • 题解
    • [392. 判断子序列](https://leetcode.cn/problems/is-subsequence/)
        • 代码
        • 题解

238. 除自身以外数组的乘积

代码
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {int* arr1 = (int*)malloc(sizeof(int) * (numsSize + 1));int* arr2 = (int*)malloc(sizeof(int) * (numsSize + 1));for (int i = 0; i < numsSize; i++) {if (i == 0)arr1[i] = nums[i];elsearr1[i] = nums[i] * arr1[i - 1];}for (int i = numsSize - 1; i >= 0; i--) {if (i == numsSize - 1)arr2[i] = nums[i];elsearr2[i] = nums[i] * arr2[i + 1];}int* ans = (int*)malloc(sizeof(int) * (numsSize + 1));for (int i = 0; i < numsSize; i++) {if (i == 0)ans[i] = arr2[i + 1];else if (i == numsSize - 1)ans[i] = arr1[i - 1];elseans[i] = arr1[i - 1] * arr2[i + 1];}*returnSize = numsSize;return ans;
}
题解

本题主要思路就是重新创建两个数组,一个用来记录下标为i左边数字的乘积和,一个用来记录下标为i右边数字的乘积和,这样子当我们统计的除nums[i]之外个元素的乘积就是arr1[i-1]*arr2[i+1]。

下面是具体思路:

  • 我们开辟两个数组arr1和arr2,分别正序与逆序遍历整个数组去给arr1和arr2赋值;
  • 正序遍历nums数组,当i==0时我们直接让arr1[i]=nums[i]就可以了,后面的我们就需要令arr1[i]等于nums[i]*arr[i-1];
  • 逆序遍历nums数组和正序遍历一样统计后面的乘积就可以了;
  • 最后我们统计ans数组数值,我们只需要让ans[i]=arr1[i-1]*arr[i+1](两个边界特殊处理)就可以了。

73. 矩阵置零

代码
void setZeroes(int** matrix, int matrixSize, int* matrixColSize) {int hash[201][201] = {0};for (int i = 0; i < matrixSize; i++) {for (int j = 0; j < *matrixColSize; j++) {if (matrix[i][j] == 0)hash[i][j] = 1;}}for (int i = 0; i < 201; i++) {for (int j = 0; j < 201; j++) {if (hash[i][j] == 1) {int hang = i;int lie = j;for (int p = 0; p < *matrixColSize; p++)matrix[hang][p] = 0;for (int p = 0; p < matrixSize; p++)matrix[p][lie] = 0;}}}
}
题解

因为我们直接在原数组中进行修改会无法判断数组中的0是原题还是修改之后的,所以本题的最直接的思路就是我们直接重新创建一个二维数组进行标记原数组为0的位置,然后重新遍历一遍新创建的数组,当遇到之前标记的位置,我们就把数组对应的行和列全部设置为0,就可以实现本题了。

394. 字符串解码

代码
char* decodeString(char* s) {char* a = (char*)malloc(sizeof(char) * 10000);int m = -1;int len = strlen(s);for (int i = 0; i < len; i++) {if (s[i] == ']') {int rightzimu = m;int leftzimu = m;while (a[leftzimu] != '[') {leftzimu--;}leftzimu++;int rightshuzi = leftzimu - 2;int leftshuzi = rightshuzi;while (leftshuzi >= 0 && a[leftshuzi] >= '0' && a[leftshuzi] <= '9')leftshuzi--;if (leftshuzi != 0)leftshuzi++;char arr[3000] = {0}; // 记录要重复的元素int arr_num = 0;for (int h = leftzimu; h <= rightzimu; h++) {arr[arr_num++] = a[h];}int num = 0; // 记录重复次数for (int h = leftshuzi; h <= rightshuzi; h++) {num *= 10;num = num + a[h] - '0';}m = leftshuzi - 1;while (num--) {for (int z = 0; z < arr_num; z++)a[++m] = arr[z];}} else {a[++m] = s[i];}}char* ans = (char*)malloc(sizeof(char) * 10000);for (int i = 0; i <= m; i++)ans[i] = a[i];ans[m + 1] = '\0';return ans;
}
题解

本题我的大概思路就是开辟一个栈去存放原字符串,当遇到非 ']' 字符时直接存进去就可以了,如果遇到了 ']' 我们就要开始进行操作了。我们需要找出所有的字母与 '[' 前的数字M,然后我们重复M次存放进栈中就可以了,最后用ans重新读取,返回答案。

具体思路如下:

  • 我们创建了一个a进行字符的存放,设置栈顶m=-1,然后遍历字符串s;
  • 当没有遇到’]‘直接存放,当遇到了’]'我们便要开始进行操作;
  • 我们令rightzimu,leftzimu等于m,此时rightzimu指的就是最后一个字母;
  • 然后我们向前遍历栈a,令leftzimu–,直到遇到’['停止,我们再令leftzimu++,此时我们rightzimu,leftzimu中间夹的就是所有的字母;
  • 然后我们令rightshuzi=leftzimu-2,因为字母与前面的数字中间有个’[';
  • 令leftshuzi=rightshuzi,再次向前遍历,令leftshuzi–,满足leftshuzi >= 0 && a[leftshuzi] >= ‘0’ && a[leftshuzi] <= ‘9’,这里有两个停止条件,一个是遍历到不是数字了,另一个是遍历到栈底停止,所以我们要进行判断:如果leftshuzi != 0,我们才需要leftshuzi++,此时我们leftshuzi和rightshuzi中间夹的就是所有的数字;
  • 然后我们统计出要重复的元素arr和重复次数num,还要将num位置更新到leftshuzi-1的位置重新开始存储;
  • 我们再循环num次,将arr中所有元素再次存放进栈中;
  • 遍历完所有s元素之后我们申请一个ans用来存放答案就可以了。

23. 合并 K 个升序链表

代码
struct ListNode* merge(struct ListNode* l1, struct ListNode* l2) {if (l1 == NULL)return l2;if (l2 == NULL)return l1;if (l1->val > l2->val) {l2->next = merge(l1, l2->next);return l2;} else {l1->next = merge(l1->next, l2);return l1;}
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {if (listsSize == 0)return NULL;if (listsSize == 1)return lists[0];for (int i = 1; i < listsSize; i++) {lists[0] = merge(lists[0], lists[i]);}return lists[0];
}
题解

本题是 21. 合并两个有序链表 这道题的升级版,合并多个有序链表。

所以我们只要会了上面这一道题,那么实现本题就很简单了。

如果是合并两个有序链表,我们用递归很容易就可以实现:

  • 如果list1为空,直接返回list2;
  • 如果list2为空,直接返回list1;
  • 后面我们就需要进行递归了;
  • 如果list1数值大于list2,那么我们就需要保存此时的list2节点并且将list1与list2->next继续进行合并并且用list2->next进行接收;
  • 反之将list2与list1->next继续进行合并并用list1->next进行接收;
  • 返回list1或list2。

下面是具体代码:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if (list1 == NULL)return list2;if (list2 == NULL)return list1;if (list1->val > list2->val) {list2->next = mergeTwoLists(list1, list2->next);return list2;} else {list1->next = mergeTwoLists(list1->next, list2);return list1;}
}

会了上面这一道题,本题只需要进行遍历整个lists并用lists[0]与list[i] (i!=0)进行合并就可以了。

下面是本题代码:

struct ListNode* merge(struct ListNode* l1, struct ListNode* l2) {if (l1 == NULL)return l2;if (l2 == NULL)return l1;if (l1->val > l2->val) {l2->next = merge(l1, l2->next);return l2;} else {l1->next = merge(l1->next, l2);return l1;}
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {if (listsSize == 0)return NULL;if (listsSize == 1)return lists[0];for (int i = 1; i < listsSize; i++) {lists[0] = merge(lists[0], lists[i]);}return lists[0];
}

232. 用栈实现队列

代码
typedef struct MyQueue {int stackIntop, stackOuttop;int stackIn[100], stackOut[100];
} MyQueue;MyQueue* myQueueCreate() {MyQueue* queue = (MyQueue*)malloc(sizeof(MyQueue));queue->stackIntop = 0;queue->stackOuttop = 0;return queue;
}void myQueuePush(MyQueue* obj, int x) { obj->stackIn[(obj->stackIntop)++] = x; }int myQueuePop(MyQueue* obj) {int inTop = obj->stackIntop;int outTop = obj->stackOuttop;if (outTop == 0) {while (inTop > 0) {obj->stackOut[outTop++] = obj->stackIn[--inTop];}}int top = obj->stackOut[--(outTop)];while (outTop > 0) {obj->stackIn[inTop++] = obj->stackOut[--outTop];}obj->stackIntop = inTop;obj->stackOuttop = outTop;return top;
}int myQueuePeek(MyQueue* obj) { return obj->stackIn[0]; }bool myQueueEmpty(MyQueue* obj) {if (obj->stackIntop == 0)return true;return false;
}void myQueueFree(MyQueue* obj) {obj->stackIntop = 0;obj->stackOuttop = 0;
}
题解
  • myQueueCreate 需要我们开辟空间,大小为MyQueue,并且将queue->stackIntop和queue->stackOuttop都初始化为0;
  • myQueuePush 直接给stackIn中存储数据并且令obj->stackIntop ++;
  • myQueuePop 需要用两个栈去实现,第一个栈是之前存数据的栈,另一个栈只是一个工具,我们需要把stackIn中的数据存储进stackOut中,这样就刚好将stackIn中栈底的元素放到了stackOut的栈顶位置,直接弹出就可以了,把剩余元素重新存入stackIn中;
  • myQueuePeek 直接返回栈底元素就可以了;
  • myQueueEmpty 若stackIntop是0,则证明没有元素,反之则有元素;
  • myQueueFree 直接将stackIntop和stackOuttop置零就可以了。

61. 旋转链表

代码
struct ListNode* rotateRight(struct ListNode* head, int k) {if (head == NULL)return head;if (head->next == NULL)return head;int len = 0;struct ListNode* cur = head;while (cur) {cur = cur->next;len++;}k %= len;while (k--) {cur = head;struct ListNode* pre = cur;while (cur->next) {pre = cur;cur = cur->next;}cur->next = head;head = cur;pre->next = NULL;}return head;
}
题解

本题我们需要先求出链表的长度len,用k进行取模(因为移动len次相当于没有移动,反倒会增加运行时间,导致超时),然后我们需要进行循环,每一次循环都找到最后一个节点,将该节点的next指向头结点,然后将最后一个节点的前一个节点pre的next指向NULL,这样就实现了一次旋转,我们循环k次就可以了。

392. 判断子序列

代码
bool isSubsequence(char* s, char* t) {int n = strlen(s), m = strlen(t);int i = 0, j = 0;while (i < n && j < m) {if (s[i] == t[j]) {i++;}j++;}if (i == n)return true;return false;
}
题解

我们用双指针可以很容易地实现本题。

  • 我们令i指向s第一个元素,j指向t第一个元素;
  • 让j向后移动,如果s[i]==t[j],让i也向后移动;
  • 遍历完t后若果i移动到了最后一个,则证明存在子序列,反之不存在。

以上就是大一上考核题解!

已经到底啦!!

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

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

相关文章

每日一题

腐烂的苹果_牛客题霸_牛客网 思路分析:广度优先遍历&#xff0c;找到所有腐烂的苹果同时向四方扩散&#xff0c;就是第一轮把所有腐烂的苹果加入队列中&#xff0c;这就跟MQ的消息队列的原理差不多&#xff0c;第一次记录队列的长度&#xff0c;广度遍历一次&#xff0c;长度--…

HCIP-OSPF综合实验

一实验拓扑图 二.实验要求 1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&…

Xinstall:让URL打开App变得如此简单

在移动互联网时代&#xff0c;App已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;在使用App的过程中&#xff0c;我们常常会遇到一些烦恼。比如&#xff0c;当我们通过一个网页链接想要打开对应的App时&#xff0c;往往需要先复制链接&#xff0c;然后在App中粘贴&a…

力扣287. 寻找重复数

Problem: 287. 寻找重复数 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 利用二分查找搜索1 ~ n中重复的元素&#xff0c;我们每次取出当前二分查找的区间的中间元素mid并在元始的数组nums中统计小于mid的元素的个数count&#xff1a; 若count > mid则说明重复的…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 4月20日,星期六

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年4月20日 星期六 农历三月十二 1、 证监会&#xff1a;调降基金股票交易佣金费率&#xff0c;年度降幅测算将达38%&#xff0c;7月1日起实施。 2、 民政部举办全国“乡村著名行动”培训班&#xff0c;助力乡村振兴。 3、…

OJ刷题日记:4、滑动窗口(2)

目录 1、904.水果成篮 2、438.找到字符串中所有字母异位词 3、30.串联所有单词的子串 4、76.最小覆盖子串 1、904.水果成篮 题目&#xff1a; 904. 水果成篮 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/fruit-into-baskets/description/ 你正在…

ROS2学习笔记(一) 基本概念

1. Node 节点 节点: 完成具体功能的模块 相关命令 #运行命令 ros2 run <package_name> <executable_name>#当前节点查询查询 ros2 node list#重映射 Remapping ros2 run <package_name> <executable_name> --ros-args --remap __node:<node_na…

机器学习和深度学习的区别

机器学习与深度学习的区别 一、原理差异二、应用差异三、实现方式差异四、在实际应用中扮演的角色1、图像识别和计算机视觉2、自然语言处理NLP3、语音识别领域4、其它—智能制造/医疗健康/金融/教育 五、总结 在人工智能领域&#xff0c;机器学习和深度学习是两个重要的概念&am…

Springboot框架——3.整合SpringMVC

1.修改端口号&#xff1a; 在application.properties中添加如下配置即可&#xff1a; server.port8088 2.静态资源访问&#xff1a; 首先打开ResourceProperties这个类的源码&#xff1a; 将静态资源放到类中默认位置即可实现访问&#xff1a; http://localhost:8088/erth.jp…

HCIE-Shell实验1

要求&#xff1a; 判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。判断web服务是否运行(1、査看进程的方式判断该程序是否运行&#xff0c;2、通过查看端口的方式判断该程序是否运行)&…

小红书情感博主暴力玩法,流量巨大,客单300+

这个项目的盈利核心在于提供情感咨询服务&#xff0c;每笔交易的利润通常在200到300元之间&#xff0c;这种方式比撰写大量情感内容来吸引流量要简单得多&#xff0c;可以说是一种快速超车的策略。 项 目 地 址 &#xff1a; laoa1.c n 我们以男性的视角提供感情建议&a…

OpenHarmony其他工具类—libharu [GN编译]

简介 libharu主要用于生成 PDF格式文件。 下载安装 直接在OpenHarmony-SIG仓中搜索libharu并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 库代码存放路径&#xff1a;./third_party/libharu 修改添加依赖的编译脚本&#xff0c;路径&#xff1a;/developtools…

Linux的firewalld防火墙

介绍firewalld&#xff1a; ①、firewalld&#xff08;Dynamic Firewall Manager of Linux systems&#xff0c;Linux系统的动态防火墙管理器&#xff09;服务是默认的防火墙配置管理工具&#xff0c;它拥有基于CLI&#xff08;命令行界面&#xff09;和基于GUI&#xff08;图…

Modelsim与Verilog入门

0.什么是Modelsim&#xff1f; Modelsim是一个支持多语言的仿真环境&#xff0c;比如我知道的Verilog和VHDL语言都可以在里边使用&#xff0c;这俩都是硬件描述语言&#xff1b; 即就是个软件&#xff0c;你可以用Verilog语言来写代码&#xff0c;然后编译&#xff0c;仿真出…

【IEEE出版 | 中山大学主办 | 往届会后2-4个月EI检索】第五届电子通讯与人工智能学术会议(ICECAI 2024)

第五届电子通讯与人工智能国际学术会议&#xff08;ICECAI 2024&#xff09; 2024 5th International Conference on Electronic communication and Artificial Intelligence 第五届电子通讯与人工智能国际学术会议&#xff08;ICECAI 2024&#xff09;将于2024年5月31日-6月…

【Redis 神秘大陆】003 数据类型使用场景

三、Redis 数据类型和使用场景 Hash&#xff1a;对象类型的数据&#xff0c;购物车List&#xff1a;队列/栈Set&#xff1a;String类型的无序集合&#xff0c;intset&#xff0c;抽奖、签到、打卡&#xff0c;商品评价标签Sorted Set&#xff1a;存储有序的元素&#xff0c;zip…

MATLAB 点到平面距离的简易计算 (61)

MATLAB 点到平面的垂直距离 (61) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 一行代码计算点到平面的距离,下面是MATLAB版本的实现方法, 使用一组自定义的点和平面验证,结果表明计算正确: 二、算法实现 1.代码 代码如下(示例): % 定义点的坐标 point = …

7.3 哈希表与布隆过滤器(入门)—— C语言实现

文章目录 前言一、哈希表1.1 哈希函数1.2 哈希冲突 二、布隆过滤器布隆过滤器的工作原理&#xff1a;存储空间与元素数量的关系&#xff1a;结论&#xff1a; 三、哈希表的代码演示3.1 哈希表扩容 四、总结参考文献 前言 本章内容参考海贼宝藏胡船长的数据结构与算法中的第七章…

算法课程笔记——集合set

3复杂度不稳定 删一个和删除全部 注意iter是类 遍历是无序的

半导体材料(三)——P-N结和金属-半导体接触

本篇为西安交通大学本科课程《电气材料基础》的笔记。 本篇为这一单元的第三篇笔记&#xff0c;上一篇传送门。 p-n结和金属-半导体接触 p-n结 无偏压开路状态 如图a所示&#xff0c;左边是n型掺杂&#xff0c;右边是p型掺杂&#xff0c;在n区和p区之间形成了一个不连续的…