刷题记录4.17-5.6

文章目录

  • 刷题记录
    • 27.移除元素
    • 977.有序数组的平方
    • 209.长度最小的子数组
    • 707.设计链表
    • 206.反转链表
    • 24.两两交换链表中的节点
    • 19.删除链表的倒数第N个节点
    • 142.环形链表II
    • 242.有效的字母异位词
    • 349.两个数组的交集
    • 454.四数相加II
    • 18.四数之和
    • 151.反转字符串中的单词
    • 459.重复的子字符串

刷题记录

27.移除元素

方法一:

class Solution {
public:int removeElement(vector<int>& nums, int val) {for(int i = 0; i < nums.size(); i++){if(nums[i] == val){for(int j = i; j < nums.size()-1; j++){nums[j] = nums[j+1];}nums.resize(nums.size()-1);i--;}}return nums.size();}
};

这是自己写出来的方法,意思是先枚举数组每一个元素,当这个元素==val时,就将后面的元素全部往前挪一个位置,这样的时间复杂度是On方的

方法二:(快慢指针)

class Solution {
public:int removeElement(vector<int>& nums, int val) {int i = 0, j = 0;while(j < nums.size()){if(nums[j] != val) nums[i++] = nums[j++];else j++;}return i;}
};

i是慢指针,j是快指针,当nums[j]不是val时就将nums[j]覆盖nums[i],这样就只使用了On的时间复杂度完成了这一题

977.有序数组的平方

方法一:

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {vector<int> res;for(int i = 0; i < nums.size(); i++){res.push_back(nums[i]*nums[i]);}sort(res.begin(), res.end());return res;}
};

这个方法就是取巧使用了sort函数,先将所有元素的平方值存入数组中,最后使用sort函数将其升序排序。

方法二:(双指针)

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {vector<int> res(nums.size());int i = 0, j = nums.size()-1, n = nums.size();while(i <= j){if(abs(nums[i]) < abs(nums[j])){res[--n] = nums[j]*nums[j];j--;}else {res[--n] = nums[i]*nums[i];i++;}}return res;}
};

考虑到给出的数组是有序的,那么左右两边的值取平方一定是放在新数组的末尾,所以这里我们就定义两个指针,一个在头,一个在尾,相向遍历数组,直到i下标大于j下标就退出循环。当然这里需要将新数组从后往前录入数据,所以需要事先开辟好res数组的空间。

209.长度最小的子数组

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int left = 0, sum = 0, ans = nums.size()+1;for(int right = 0; right < nums.size(); right++){sum += nums[right];while(sum >= target){ans = min(ans, right-left+1);sum -= nums[left++];}}return ans == nums.size()+1 ? 0 : ans;}
};

这道题运用的方法也是双指针滑动窗口,外层循环枚举数组每个元素,内层循环用来使符合的子数组长度最小,只要这段子数组的和一直>=target,左指针就不断的右移并更新ans长度和减去左边界的值。

707.设计链表

class MyLinkedList {
public:struct ListNode{int val;ListNode* next;ListNode(int num) : val(num), next(nullptr){}};MyLinkedList() {dummyhead = new ListNode(0);Size = 0;}int get(int index) {if(index+1 > Size || index < 0) return -1;ListNode* pmove = dummyhead;while(index--) pmove = pmove->next;return pmove->next->val;}void addAtHead(int val) {ListNode* s = new ListNode(val);s->next = dummyhead->next;dummyhead->next = s;Size++;}void addAtTail(int val) {ListNode* pmove = dummyhead;while(pmove->next) pmove = pmove->next;ListNode* s = new ListNode(val);pmove->next = s;Size++;}void addAtIndex(int index, int val) {if(index > Size) return;ListNode* pmove = dummyhead;while(index--) pmove = pmove->next;ListNode* s = new ListNode(val);s->next = pmove->next;pmove->next = s;Size++;}void deleteAtIndex(int index) {if(index >= Size || index < 0) return;ListNode* pmove = dummyhead;while(index--) pmove = pmove->next;pmove->next = pmove->next->next;Size--;}private:int Size;ListNode* dummyhead;
};/*** Your MyLinkedList object will be instantiated and called as such:* MyLinkedList* obj = new MyLinkedList();* int param_1 = obj->get(index);* obj->addAtHead(val);* obj->addAtTail(val);* obj->addAtIndex(index,val);* obj->deleteAtIndex(index);*/

这个题让设计一个链表,包括链表的基本操纵,基本的插入删除操作还是没有忘,只不过在一些细节上不是很完美,首先定义一个结构体,因为是链表加上题目给的数据是int类型的,所以val是数据域,next是指针域。定义两个私有成员变量,大小size和虚拟头节点dummyhead。我感觉这个题ac不了的问题在于不能明确结构体结点和类之间的差别。

206.反转链表

双指针迭代法:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* cur = head, *pre = nullptr, *temp;while(cur != nullptr){temp = cur->next;cur->next = pre;pre = cur;cur = temp;}return pre;}
};

这里最好是将cur = head, pre = nullptr,因为第一个结点在反转完链表后要置为空的,如果是pre = head, cur = head->next的话,会导致代码变得复杂,需要单独将第一次操作提出来,还需要判断head是否为空。

递归法:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverse(ListNode* cur, ListNode* pre){if(cur == nullptr) return pre;ListNode* temp = cur->next;cur->next = pre;return reverse(temp, cur);}ListNode* reverseList(ListNode* head) {return reverse(head, nullptr);}
};

递归理解起来可能会比较晦涩,其实本质上也是双指针迭代,两个参数初始化cur=head, pre = nullptr,递归终点也是在cur==nullptr的时候退出,这里在写的时候都需要注意的是:需要借助一个临时变脸来记录cur->next,否则会导致死循环或者递归结果不正确,那是因为在第二次循环或递归之前会有cur->next=pre的操作。

24.两两交换链表中的节点

解法一:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:void exchange(ListNode* node){if(node == nullptr || node->next == nullptr) return;int temp = node->val;node->val = node->next->val;node->next->val = temp;exchange(node->next->next);}ListNode* swapPairs(ListNode* head) {//if(head == nullptr) return nullptr;exchange(head);return head;}
};

这也是我自己的解法,当然是在捡漏,因为每个节点的val值一定是相同的,所以我就只改动了数据域而非指针域,但是当数据域多的话用这个方法就显得十分笨拙。

解法二:

class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode* dummyhead = new ListNode(0, head);ListNode* cur = dummyhead;while(cur->next != nullptr && cur->next->next != nullptr){ListNode* temp1 = cur->next;ListNode* temp2 = cur->next->next->next;cur->next = cur->next->next;cur->next->next = temp1;temp1->next = temp2;cur = cur->next->next;}return dummyhead->next;}
};

这个解法就是修改指针域,首先定义一个虚拟头节点dummyhead,假设节点a->b->c当cur指向a的时候才能将b和c的指针域进行交换,以此类推,如何判断循环退出的条件?当链表为奇数个数时:cur->next->next == nullptr是循环退出的标志,当链表个数为偶数个时:cur->next == nullptr为退出标志。注意cur->next一定要在cur->next->next的前面,否则会给出空指针异常。再就是更改指针的逻辑,一定要确定好更改的顺序,时常要用到临时的指针变量进行保存位置,否则连接就会混乱。工作指针移动的条件是cur = cur->next->next,忘写会时间超限,并且一定不能出错。最后返回虚拟头节点的next即为最后的答案。

19.删除链表的倒数第N个节点

解法一:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummyhead = new ListNode(0, head);int num = 0;ListNode* pmove = head;while(pmove){num++;pmove = pmove->next;}int pos = num-n;cout << pos;ListNode* p = dummyhead;int count = 0;while(p){if(count == pos){p->next = p->next->next;break;}count++;p = p->next;}return dummyhead->next;}
};

这当然也是最笨拙的方法,遍历两边链表。

解法二:

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummyhead = new ListNode(0, head);ListNode* fast = dummyhead, *low = dummyhead;int count = n+1;while(count-- && fast) fast = fast->next;while(fast){fast = fast->next;low = low->next;}low->next = low->next->next;return dummyhead->next;}
};

这里只遍历了一遍链表,果然在遇到链表题的时候双指针有时候真的有奇效啊。这里先用fast指针遍历前n+1个元素,然后再让fast指针和low指针一起移动,直到fast指针移到末尾,这时low指针就指向了要删除元素的前一个位置,最后low->next = low->next->next达到删除链表倒数第N个节点的效果。

142.环形链表II

解法一:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {unordered_set<ListNode*> visited;ListNode* pmove = head;while(pmove){if(find(visited.begin(), visited.end(), pmove) != visited.end()) return pmove;visited.insert(pmove);pmove = pmove->next;}return nullptr;}
};

这道题用的是哈希表,唉我看到题的第一映像也是用哈希表,可是我就在想,如果遇到了重复的元素值那就哈希表就不能达到效果,那么为什么这个哈希表却能用呢?原来这个是将哈希表的类型定义成节点类型的指针,这就说得通了,虽然节点的val值可能会相同,但是每个节点所存储的地址一定是不同的,当遍历到哈希表有存储过的节点时,这个节点就是我们要找的环形链表的起始位置。

这个题告诉了我们什么?其实你的方法可能是正确的,你其实离真相很近,但是你却中途选择了放弃,当然这样你也与成功失之交臂了。

解法二:

class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* fast = head, *low = head;while(true){if(fast == nullptr || fast->next == nullptr) return nullptr;fast = fast->next->next;low = low->next;if(fast == low) break;}fast = head;while(fast != low){fast = fast->next;low = low->next;}return fast;}
};

这个呢主要是用到了数学的关系式,这对于我这个数学菜鸡来说简直就是天方夜谭,主要步骤就是让fast指针每次走两个节点,low指针每次走一个节点,这样如果有环的话fast指针一定会追上low指针,然后再将fast指针置为head再次移动fast和low,此时两个指针都是一个节点一个节点地移动,直到fast和low相等的时候就是我们要找到的目标位置。

242.有效的字母异位词

class Solution {
public://a = 97bool isAnagram(string s, string t) {vector<int> hash(26, 0);for(char w : s) hash[w-'a']++;for(char w : t) hash[w-'a']--;for(int i = 0; i < 26; i++){if(hash[i] != 0) return false;}return true;}
};

这里使用的是哈希表来解决问题,哈希表分为三种:数组、set和map,数组的应用场景通常在能够确定数组大小等简单情景下使用,这里只会出现

349.两个数组的交集

unordered_set写法:

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> hash;for(int n : nums1) hash.insert(n);set<int> s;sort(nums2.begin(), nums2.end());for(int i = 0; i < nums2.size(); i++){if(hash.find(nums2[i]) != hash.end()) s.insert(nums2[i]);}return vector<int>(s.begin(), s.end());}
};

数组写法:

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> hash(1001, 0);for(int a : nums1) hash[a]++;set<int> s;for(int i = 0; i < nums2.size(); i++){if(hash[nums2[i]]) s.insert(nums2[i]);}return vector<int>(s.begin(), s.end());}
};

两种写法都大差不差,都是先遍历nums1数组用哈希表来存储,第二次遍历nums2数组来记录两个数组的交集元素,存储在set中,由于最后返回的是数组,我们用return vector< int >(s.begin(), s.end());来转换。

454.四数相加II

class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {unordered_map<int, int> m1, m2;for(int a : nums1){for(int b : nums2) m1[a+b]++;}int count = 0;for(int a : nums3){for(int b : nums4){int temp = 0-(a+b);if(m1[temp]) count += m1[temp];}}return count;}
};

解决过程:将四个数组分成两个对数组,先将前一对数组进行各元素相加,将取得的值存入m1哈希表中,这里采用的哈希表需要记录求和的个数,则需要数值到个数之间的映射,所以这里用到的哈希表为unordered_map,遍历完第一对数组之后,就类似于1.两数相加的题型了,如果在差值在m1中出现过,那么我们就将count累加,注意count = m1[0-(a+b)];而不是count++;

18.四数之和

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> res;sort(nums.begin(), nums.end());int n = nums.size();for(int i = 0; i < n-3; i++){if(i && nums[i] == nums[i-1]) continue;for(int j = i+1; j < n-2; j++){int left = j+1, right = n-1;if(i+1 < j && nums[j] == nums[j-1]) continue;if((long long)nums[i]+nums[j]+nums[j+1]+nums[j+2] > target) break;if((long long)nums[i]+nums[j]+nums[n-1]+nums[n-2] < target) continue;while(left < right){long long temp = (long long)nums[i]+nums[j]+nums[left]+nums[right];if(temp < target) left++;else if(temp > target) right--;else{res.push_back({nums[i], nums[j], nums[left], nums[right]});//cout << i << j << left << right;for(++left; left < right && nums[left] == nums[left-1]; left++);for(--right; left < right && nums[right] == nums[right+1]; right--);}}}}return res;}
};

这一题的解法与三数之和是同样的,都是用到了双指针的方法,然后外面套两层循环来枚举数组,这里需要注意的点是:在我提交后发现有int类型的溢出错误,我就尝试先将temp的类型改成long long,结果还是报错,查了之后才发现需要在nums数组前面也要强制转化成long long型,这样得出来的数组结果也会向上转型成long long类型。否则在数组累加的过程中会导致先int型溢出了然后无法赋值给temp的情况。

151.反转字符串中的单词

class Solution {
public:void func(string& s, int left, int right){while(left < right) swap(s[left++], s[right--]);}void deletespace(string& s){//i快指针 j慢指针int i, j = 0;for(i = 0; i < s.size(); i++){//快指针非空 进行替换操作if(s[i] != ' '){//在每个单词之前手动添加空格if(j != 0) s[j++] = ' ';//进行替换while(i < s.size() && s[i] != ' ') s[j++] = s[i++];}}s.resize(j);}string reverseWords(string s) {//先除去非法空格deletespace(s);//反转所有字符串func(s, 0, s.size()-1);//反转每个单词之间的字符int start = 0;for(int i = 0; i <= s.size(); i++){if(i == s.size() || s[i] == ' '){func(s, start, i-1);start = i+1;}}return s;}
};

首先反转单词和反转字符十分像,但是需要发现怎么将反转字符的方法用到反转单词上,这里给出的方法是先将字符串s整体反转,然后再将单词之间内部再次反转,,这样就达到了将字符串中的单词反转的效果了。这里还有一个算法,就是去除不合法的空格:用到的是快慢双指针,与前面的27.移除元素是一个道理,移除元素是将元素的某个val值删除,这里删除空格也就是可以看成将一个数组全部为char型,然后删除字符’ '即可。只不过英语语句有这样一个特点:句子没有前缀空格,单词与单词之间有一个空格,所以如果慢指针j != 0需要在替换之前先添加空格。

459.重复的子字符串

class Solution {
public:void getNext(int next[], string s){next[0] = 0;int j = 0;for(int i = 1; i < s.size(); i++){while(j > 0 && s[j] != s[i]) j = next[j-1];if(s[i] == s[j]) j++;next[i] = j;}}bool repeatedSubstringPattern(string s) {if(s.empty()) return false;int n = s.size();int next[n];getNext(next, s);if(next[n-1] != 0 && n%(n-next[n-1]) == 0) return true;return false;}
};

这里用到的是kmp算法,getNext函数求相等前后缀表,这个理解起来是在困难,还是先先记下来为妙吧。。。while那行一定不能写成if,也不能少了j>0的条件,这一句是在不相等的情况下。if语句是在两个字符相等的情况下,循环最后将当前next[i]值赋值成j,即当前下标的前后缀相等数。然后就是主函数中判断题目中给出的意思,n-next[n-1]是用来找出最短的符合条件的子串,然后如果能被总长度整除,那么这个字符串可以由某个子串重复构成。这怎么会是简单题???可能简单在于比较好暴力吧,感觉这个kmp还是挺难理解的,加上最后需要取余来判断是否满足条件,这也是很难想到的。

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

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

相关文章

Educational Codeforces Round 165 (Rated for Div. 2) E. Unique Array 贪心+线段树

Unique Array 题目描述 给你一个长度为 n n n 的整数数组 a a a 。 a a a 的子数组是其连续的子序列之一&#xff08;即数组 [ a l , a l 1 , … , a r ] [a_l, a_{l1}, \dots, a_r] [al​,al1​,…,ar​] 中的某个整数 l l l 和 r r r 的子数组 1 ≤ l < r ≤ n …

如何检查 MIDI 文件的安全性

检查 MIDI 文件的安全性通常涉及几个步骤&#xff0c;因为 MIDI 文件本身并不包含可执行代码&#xff0c;所以它们不是传统意义上的恶意软件载体。然而&#xff0c;它们仍然可能以间接的方式带来安全风险&#xff0c;例如通过诱导用户下载与 MIDI 文件一起提供的恶意附件或链接…

JS基础:变量的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃&#xff0c;大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端基础路线”&#xff0c;可获取…

Leetcode181_超过经理收入的员工

1.leetcode原题链接:. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 表&#xff1a;Employee ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | | salary | int | | manage…

零基础入门学习Python第二阶01生成式(推导式),数据结构

Python语言进阶 重要知识点 生成式&#xff08;推导式&#xff09;的用法 prices {AAPL: 191.88,GOOG: 1186.96,IBM: 149.24,ORCL: 48.44,ACN: 166.89,FB: 208.09,SYMC: 21.29}# 用股票价格大于100元的股票构造一个新的字典prices2 {key: value for key, value in prices.i…

病毒及网络攻击(信息安全)

一、病毒 计算机病毒的特征&#xff1a;传播性、隐蔽性、感染性、潜伏性、触发性、破坏性等 Worm -- 蠕虫病毒 Trojan -- 特洛伊木马 Backdoor -- 后门病毒 Macro -- 宏病毒 宏病毒 感染的对象主要是 文本文档、电子表格等 木马病毒&#xff1a;冰河 蠕虫病毒&#xff1a;欢乐时…

Java的java.util.concurrent.ExecutorService简介

在Java并发编程的璀璨星空中&#xff0c;ExecutorService无疑是那颗最耀眼的明星。它不仅是Java并发编程的核心组件之一&#xff0c;更是构建高并发、高性能应用的秘密武器。今天&#xff0c;我们就来一场说走就走的探索之旅&#xff0c;揭开它的神秘面纱&#xff01; &#x1…

关于排序算法这一篇就够了

排序算法是计算机科学中的一个基本问题&#xff0c;它涉及到将一组数据元素&#xff08;如整数、浮点数、字符串等&#xff09;按照某种顺序&#xff08;如升序或降序&#xff09;进行排列。以下是您提到的几种排序算法的概念和相应的Java实现&#xff1a; 1. 冒泡排序&#x…

已解决javax.sound.sampled.LineUnavailableException异常的正确解决方法,亲测有效!!!

已解决javax.sound.sampled.LineUnavailableException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 检查音频设备是否被其他应用占用 确认音频格式设置 更新或重装音频驱动…

深度学习中的不确定性量化:技术、应用和挑战综述(一)

不确定性量化(UQ)在减少优化和决策过程中的不确定性方面起着关键作用&#xff0c;应用于解决各种现实世界的科学和工程应用。贝叶斯近似和集成学习技术是文献中使用最广泛的两种UQ方法。在这方面&#xff0c;研究人员提出了不同的UQ方法&#xff0c;并测试了它们在各种应用中的…

vscode查看linux内核代码报错“Unknown argument:“无法跳转函数问题

vscode查看linux内核代码报错问题 现在一直使用bearclangdvscode查看代码&#xff0c; 今天用gcc 9.4.0版本编译Linux 6.6内核代码&#xff0c;编译后发现无法函数跳转。 vscode报错信息如下&#xff1a; Unknown argument: -fconserve-stack Unknown argument: -femit-stru…

Ansible自动化运维工具单模块介绍

前言 自动化运维是指利用自动化工具和技术来简化、自动化和优化IT基础设施的管理和运维过程&#xff0c;从而提高效率、降低成本&#xff0c;并减少人为错误。在当今复杂的IT环境中&#xff0c;自动化运维已经成为许多组织和企业提高生产力和保证系统稳定性的重要手段。Ansibl…

动态规划算法:路径问题

例题一 解法&#xff08;动态规划&#xff09;&#xff1a; 算法思路&#xff1a; 1. 状态表⽰&#xff1a; 对于这种「路径类」的问题&#xff0c;我们的状态表⽰⼀般有两种形式&#xff1a; i. 从 [i, j] 位置出发&#xff0c;巴拉巴拉&#xff1b; ii. 从起始位置出…

使用Simcenter全面评估SiC 器件的特性

内容摘要 传统的硅金属-氧化物-半导体场效应晶体管 (MOSFET) 具有成熟的技术和低廉的成本&#xff0c;在中压和绝缘栅双极晶体管 (IGBT) 高压功率电子器件中占主导地位。使用碳化硅等具有高电离能的新型宽带隙材料&#xff0c;可以制造出具有快速开关时间和超过1,000伏击穿电压…

博客网站SpringBoot+Vue项目练习

博客网站SpringBootVue简单案例 前言 学了vue后一直没用找到应用的机会&#xff0c;在Github上找到了一个看起来比较友好的项目&#xff08;其实具体代码我还没看过&#xff09;。而且这个项目作者的readme文档写的也算是比较好的了。 项目链接&#xff1a;https://github.c…

【LeetCode刷题】739. 每日温度(单调栈)

1. 题目链接2. 题目描述3. 解题方法4. 代码 1. 题目链接 739. 每日温度 2. 题目描述 3. 解题方法 用一个栈st保存每个数的下标&#xff0c;同时创建一个数组res保存结果&#xff0c;初始值都为0。循环遍历题目中的数组temperature。如果temperature[i] > st.top()&#x…

MATLAB和Python网格桁架框架构件刚度载荷位移和受力微分方程

&#x1f3af;要点 数学​方法​&#xff1a;&#x1f3af;一维线性边界值问题&#xff1a;&#x1f58a;高斯求积法则 | &#x1f58a;洛巴托求积法则 | &#x1f58a;矩阵插值和微分计算 | &#x1f58a;在细化网格上生成值。&#x1f3af;二维边界值问题&#xff1a;构建二…

Linux--IIC驱动编程实验

对于 I2C 主机驱动&#xff0c;一旦编写完成就不需要再做修改&#xff0c;其他的 I2C 设备直接调用主机驱动提供的 API 函数完成读写操作即可。这个正好符合 Linux 的驱动分离与分层的思想&#xff0c;因此 Linux内核也将 I2C 驱动分为两部分&#xff1a; ①、 I2C 总…

虚拟化之---virtio通信

一、理解virtio的背景 我们知道虚拟化hypervisor大的类型分为两种&#xff0c;全虚拟化和半虚拟化。 在全虚拟化的解决方案中&#xff0c;guest VM 要使用底层 host 资源&#xff0c;需要 Hypervisor 来截获所有的请求指令&#xff0c;然后模拟出这些指令的行为&#xff0c;这样…

Java毕设之学院党员管理系统的设计与实现

运行环境 环境说明: 开发语言:java 框架:springboot&#xff0c;vue JDK版本:JDK1.8 数据库:mysql5.7(推荐5.7&#xff0c;8.0也可以) 数据库工具:Navicat11 开发软件:idea/eclipse(推荐idea) Maven包:Maven3.3.9 系统实现 管理员功能实现 党员管理 管理员进入指定功能操作…