leetcode(力扣)刷题笔记(c++)【下】

news2024/11/25 6:52:10

文章预览:

  • 单调栈
    • 739. 每日温度
    • 496.下一个更大元素 I
    • 503. 下一个更大元素 II
    • 42. 接雨水
    • 84.柱状图中最大的矩形
  • 额外题目
    • 1365.有多少小于当前数字的数字
    • 941. 有效的山脉数组
    • 1207. 独一无二的出现次数
    • 189. 轮转数组
    • 724. 寻找数组的中心下标
    • 922. 按奇偶排序数组 II
  • 后续刷题记录
    • 21 合并有序链表

参考刷题链接代码随想录

单调栈

739. 每日温度

法一:暴力
超出时间限制

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        vector<int> result(temperatures.size(),0);
        for(int i=0;i<temperatures.size();i++){
            for(int j=i+1;j<temperatures.size();j++){
                if(temperatures[j]>temperatures[i]){
                    result[i]=j-i;
                    break;
                }
            }
        }
        return result;
    }
};

法二:单调栈
栈必须先判断是否为空再取栈顶元素

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        // 递增栈  栈内放元素下标,因为要计算距离
        stack<int> st;
        vector<int> result(temperatures.size(), 0);
        st.push(0);//先放入第一个元素
        for(int i=1;i<temperatures.size();i++){
            if(temperatures[i]<=temperatures[st.top()]){
                st.push(i);
            }
            else{
                while(!st.empty()&&temperatures[i]>temperatures[st.top()]){//判断空必须放在前面
                    result[st.top()]=i-st.top();
                    st.pop();
                }
                st.push(i);
            }           
        }
        return result;
    }
};

496.下一个更大元素 I

法一:单调栈
对nums2使用单调栈,就可以获得nums2中每个元素的下一个更大元素,在循环里面判断nums2[i]是否出现在nums1中,因为nums1是nums2的子集。
写法一:使用unordered_map记录nums1的元素值和下标
使用umap是便于查找

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result(nums1.size(),-1);
        stack<int> st;//存放nums的元素值
        unordered_map<int, int> umap;
        for(int i=0;i<nums1.size();i++){
            umap[nums1[i]]=i;//key为元素值,value为下标
        }
        st.push(nums2[0]);
        for(int i=1;i<nums2.size();i++){
            while(!st.empty()&&nums2[i]>st.top()){
                if(umap.find(st.top())!=umap.end()){//说明在nums1中找到了
                    result[umap[st.top()]]=nums2[i];
                }
                st.pop();
            }
            st.push(nums2[i]);
        }
        return result;

    }
};

写法二:直接利用find函数对nums1进行查找
迭代器之间相减就可以获得距离

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result(nums1.size(),-1);
        stack<int> st;//存放nums的元素值
        st.push(nums2[0]);
        for(int i=1;i<nums2.size();i++){
            while(!st.empty()&&nums2[i]>st.top()){
                auto it=find(nums1.begin(),nums1.end(),st.top());
                if(it!=nums1.end()){//说明在nums1中找到了
                    result[it-nums1.begin()]=nums2[i];
                }
                st.pop();
            }
            st.push(nums2[i]);
        }
        return result;

    }
};

503. 下一个更大元素 II

法一:单调栈

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        //使用单调栈
        stack<int> st;
        vector<int> new_nums;
        //拼接成一个新数组
        for(int i=0;i<nums.size();i++){
            new_nums.push_back(nums[i]);
        }
        for(int i=0;i<nums.size();i++){
            new_nums.push_back(nums[i]);
        }
        vector<int> result(new_nums.size(),-1);
        st.push(0);
        for(int i=1;i<new_nums.size();i++){
            while(!st.empty()&&new_nums[i]>new_nums[st.top()]){
                result[st.top()]=new_nums[i];
                st.pop();
            }
            st.push(i);
        }
        result.resize(new_nums.size()/2);
        return result;
    }
};

42. 接雨水

法一:双指针。时间复杂度为O(n^2)。 空间复杂度为O(1)。按列查找,找到左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度。
超出时间限制

class Solution {
public:
    int trap(vector<int>& height) {
        //使用双指针
      int result=0;
      for(int i=0;i<height.size();i++){
          if(i==0||i==height.size()-1) continue;//第一个和最后一个不接水
          int right_maxh=0;
          for(int j=i+1;j<height.size();j++){
              //找右边最大值
              if(height[j]>right_maxh) right_maxh=height[j];
          }
          int left_maxh=0;
          for(int j=0;j<i;j++){
              //找i左边最高值
              if(height[j]>left_maxh) left_maxh=height[j];
          }
          int h=min(left_maxh,right_maxh)-height[i];
          if(h > 0) result+=h;

      }  
      return result;
    }
};

在这里插入图片描述法二:动态规划

当前列雨水面积:min(左边柱子的最高高度,记录右边柱子的最高高度) - 当前柱子高度。
为了得到两边的最高高度,使用了双指针来遍历,每到一个柱子都向两边遍历一遍,这其实是有重复计算的。我们把每一个位置的左边(包含当前位置)最高高度记录在一个数组上(maxLeft),右边(包含当前位置)最高高度记录在一个数组上(maxRight)。这样就避免了重复计算,这就用到了动态规划。
包含当前位置的原因:如果最高高度和当前位置高度一样,那就说明不能装水,算出来面积是0,不影响后面的计算,不需要再判断大小

class Solution {
public:
    int trap(vector<int>& height) {
        //使用动态规划计算每个位置左边和右边最高柱子高度
        if (height.size() <= 2) return 0;
        vector<int> maxLeft(height.size(), 0);//maxLeft[i]:i位置前(包括i)的最高柱子
        vector<int> maxRight(height.size(), 0);//maxRight[i]:i位置后(包括i)的最高柱子
        maxLeft[0]=height[0];
        int size=height.size();
        for(int i=1;i<size;i++){
           maxLeft[i]=max(height[i],maxLeft[i-1]);
        }
        maxRight[size-1]=height[size-1];
        for(int i=size-2;i>=0;i--){
            maxRight[i]=max(height[i],maxRight[i+1]);
        }

        int result=0;
        for(int i=0;i<size;i++){
            int h=min(maxLeft[i],maxRight[i])-height[i];
            result+=h;
        }
        return result;
    }
};

法三:单调栈
由于是横向计算,所以需要跳过高度相同的柱子,不然计算面积时会重复

class Solution {
public:
    int trap(vector<int>& height) {
        if (height.size() <= 2) return 0; // 可以不加
        stack<int> st; // 存着下标,计算的时候用下标对应的柱子高度
        st.push(0);
        int sum = 0;
        for (int i = 1; i < height.size(); i++) {
            if (height[i] < height[st.top()]) {     // 情况一
                st.push(i);
            } 
            else if (height[i] == height[st.top()]) {  // 情况二
                st.pop(); // 其实这一句可以不加,效果是一样的,但处理相同的情况的思路却变了。
                st.push(i);
            } else {                                // 情况三
                while (!st.empty() && height[i] > height[st.top()]) { // 注意这里是while
                    int mid = st.top();
                    st.pop();
                    if (!st.empty()) {
                        int h = min(height[st.top()], height[i]) - height[mid];
                        int w = i - st.top() - 1; // 注意减一,只求中间宽度
                        sum += h * w;
                    }
                }
                st.push(i);
            }
        }
        return sum;
    }
};

不跳过相同高度的柱子也可以通过,因为h = min(height[st.top()], height[i]) - height[mid]对相同高度柱子的右边的柱子算出来是0,因为该柱子左边的柱子和自己高度相同

class Solution {
public:
    int trap(vector<int>& height) {
        if (height.size() <= 2) return 0; // 可以不加
        stack<int> st; // 存着下标,计算的时候用下标对应的柱子高度
        st.push(0);
        int sum = 0;
        for (int i = 1; i < height.size(); i++) {
            if (height[i] <= height[st.top()]) {     // 情况一
                st.push(i);
            } 
            // else if (height[i] == height[st.top()]) {  // 情况二
            //     st.pop(); // 其实这一句可以不加,效果是一样的,但处理相同的情况的思路却变了。
            //     st.push(i);
            // } 
            else {                                // 情况三
                while (!st.empty() && height[i] > height[st.top()]) { // 注意这里是while
                    int mid = st.top();
                    st.pop();
                    if (!st.empty()) {
                        int h = min(height[st.top()], height[i]) - height[mid];
                        int w = i - st.top() - 1; // 注意减一,只求中间宽度
                        sum += h * w;
                    }
                }
                st.push(i);
            }
        }
        return sum;
    }
};

84.柱状图中最大的矩形

踩坑想法:刚开始想的是找到最高柱子,再从最高柱子两边延展,但是最大矩形不一定包含了最高的柱子

思路分析:
我们可以遍历每根柱子,以当前柱子 i 的高度作为矩形的高,那么矩形的宽度边界即为向左找到第一个高度小于当前柱体 i 的柱体,向右找到第一个高度小于当前柱体 i 的柱体。

对于每个柱子我们都如上计算一遍以当前柱子作为高的矩形面积,最终比较出最大的矩形面积即可。

法一:动态规划
使用两个数组分别记录当前i为高时,矩阵的边界,这样就可以算出矩形的宽

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int size=heights.size();
        vector<int> left(size,0);//左边第一个高度小于当前柱体 i 的柱体的下标
        vector<int> right(size,0);//右边第一个高度小于当前柱体 i 的柱体的下标
        left[0]=-1;//防止while死循环
        for(int i=1;i<size;i++){//向左查找
            int t=i-1;
            while(t>=0&&heights[i]<=heights[t]){//这里有等号
                t=left[t];//这里并不是通过t--来找,t--这样比较费时
            }
            left[i]=t;
        }
        right[size-1]=size;//防止while死循环
        for(int i=size-2;i>=0;i--){//向右查找
            int t=i+1;
            while(t<size&&heights[i]<=heights[t]){
                t=right[t];
            }
            //如果右边没有比当前位置小的,那right[i]=size
            //也就是当前位置作为高时,右边的所有柱子都可以和i组成矩形
            right[i]=t;
        }
        int result=0;
        for(int i=0;i<size;i++){
            int sum=right[i]-left[i]-1;//矩形的宽
            result=max(sum*heights[i],result);
        }
        return result;
        
        
    }
};

法二:单调栈
栈底到栈顶为递增顺序,当进入while循环时,栈顶的下一个元素就是左边第一个小于i的高度,栈头就是右边的第一个高度

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        //单调栈,栈底到栈顶为递增顺序
        heights.insert(heights.begin(), 0); // 数组头部加入元素0
        heights.push_back(0); // 数组尾部加入元素0
        int size=heights.size();
        stack<int> st;
        st.push(0);
        int result=0;
        for(int i=1;i<size;i++){
            if(heights[i]>=heights[st.top()]){
                st.push(i);
            }
            else{
                while(!st.empty() && heights[i]<heights[st.top()]){
                    int mid=st.top();
                    st.pop();
                    int w=i-st.top()-1;
                    result=max(result,w*heights[mid]);

                }
                st.push(i);
            }
        }
        
        return result;
    }
};

额外题目

1365.有多少小于当前数字的数字

法一:暴力

class Solution {
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums) {
        vector<int> result(nums.size(),0);
        for(int i=0;i<nums.size();i++){
            for(int j=0;j<nums.size();j++){
                if(j==i) continue;
                if(nums[j]<nums[i]) result[i]++;
            }
        }
        return result;
    }
};

941. 有效的山脉数组

法一:先找到arr最大值,再判断两边情况

class Solution {
public:
    bool validMountainArray(vector<int>& arr) {
        if(arr.size()<3) return false;
        int max_num=0;
        int index=0;
        for(int i=0;i<arr.size();i++){
            if(max_num<arr[i]){
                max_num=arr[i];
                index=i;
            }
        }
        if(index==0||index==arr.size()-1) return false;
        for(int i=0;i<index;i++){
            if(arr[i]>=arr[i+1]) return false;
        }
        for(int i=index;i<arr.size()-1;i++){
            if(arr[i]<=arr[i+1]) return false;
        }
        return true;
    }
};

法二:双指针
从左到右找到严格递增的最高点,从右到左找到严格递增的最高点,再比较两者位置是否相等

class Solution {
public:
    bool validMountainArray(vector<int>& arr) {
        int left=0;
        int right=arr.size()-1;
        while(left<arr.size()-1&&arr[left]<arr[left+1]){
            left++;            
        }
        while(right>0&&arr[right]<arr[right-1]){
            right--;
        }
        if(left==right&&left!=0&&right!=arr.size()-1) return true;
        return false;
    }
};

1207. 独一无二的出现次数

class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        unordered_map<int,int> m;
        for(int i=0;i<arr.size();i++){//统计出现次数
            m[arr[i]]++;
        }
        map<int,int> count_m;//key不允许有重复的
        for(auto it=m.begin();it!=m.end();it++){
            count_m[it->second]++;
        }
        if(m.size()!=count_m.size()) return false;
        return true;
    }
};

189. 轮转数组

法一:设一个新数组,先取后面的k个数字,再取前面的nums.size()-k个数字,但是需要注意如果k>nums.size()时,需要对k进行处理

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        if(nums.size()<k) k=k-k/nums.size()*nums.size();
        vector<int> result;
        for(int i=nums.size()-k;i<nums.size();i++){
            result.push_back(nums[i]);
        }
        for(int i=0;i<nums.size()-k;i++){
            result.push_back(nums[i]);
        }
        nums=result;
    }
};

法二:使用空间复杂度为 O(1) 的 原地 算法
注意reverse是前闭后开区间

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        if(nums.size()<k) k=k-k/nums.size()*nums.size();
        reverse(nums.begin(),nums.end());
        reverse(nums.begin(),nums.begin()+k);
        reverse(nums.begin()+k,nums.end());
    }
};

724. 寻找数组的中心下标

1.遍历一遍求出总和sum
2.遍历第二遍求中心索引左半和leftSum
判断sum-nums[i]=2*k?

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int sum=0;
        for(int i=0;i<nums.size();i++){
            sum+=nums[i];
        }
        int k=0;
        for(int i=0;i<nums.size();i++){
            if(i==0||(i==nums.size()-1)){
                if(sum-nums[i]==0)
                return i;
            }
            else{
                k+=nums[i-1];
                if(sum-nums[i]==2*k) return i;
            }
            
        }
        return -1;
    }
};

922. 按奇偶排序数组 II

法一:不适用额外空间
第一层while遍历每个元素,第二个while相当于还是遍历每个元素,时间复杂度O(n^2)

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        //使用双指针
        int slow=0;
        int fast=0;
        while(slow<nums.size()){
            if(nums[slow]%2==1 && slow%2==0){//只对这种情况进行交换
                fast=0;
                while(!(nums[fast]%2==0&&fast%2==1)){
                    fast++;
                    if(fast>=nums.size()) break;
                }
                if(fast>=nums.size()) break;
                //交换
                int temp=nums[slow];
                nums[slow++]=nums[fast];
                nums[fast]=temp;
            }
            slow++;
        }
        return nums;
    }
};

优化写法:其实和前面的思路一致。

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        int index=1;//奇数位
        for(int i=0;i<nums.size();i+=2){//遍历偶数位
            if(nums[i]%2==1){
                while(nums[index]%2!=0) index+=2;
                swap(nums[index],nums[i]);
            }
        }
        return nums;
    }
};

每次while循环fast不一定从头开始寻找,因为前面需要更换的已经换过了,再读取一遍造成浪费

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
        //使用双指针
        int slow=0;
        int fast=1;
        while(slow<nums.size()){
            if(nums[slow]%2==1 ){//只对这种情况进行交换
                while(nums[fast]%2!=0){
                    fast+=2;
                    if(fast>=nums.size()) break;
                }
                if(fast>=nums.size()) break;
                //交换
                swap(nums[slow],nums[fast]);
            }
            slow+=2;
        }
        return nums;
    }
};

后续刷题记录

21 合并有序链表

/**
 * 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* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode* virtul_head=new ListNode(0);//虚拟头节点
        ListNode* temp=virtul_head;
        while(list1&&list2){
            //将两个链表中较小的节点加到新链表的下一个
            //类似于双指针的思想,list1和list2指向两个链表中还未加入新链表的第一个节点
            if(list1->val<list2->val){
                temp->next=list1;
                list1=list1->next;
            }
            else{
                temp->next=list2;
                list2=list2->next;
            }
            temp=temp->next;//temp指向新链表的最后一个节点
            // temp->next=NULL;

        }
        if(list1!=NULL){
            temp->next=list1;
        }
        if(list2!=NULL){
            temp->next=list2;
        }
        return virtul_head->next;
    }
};

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

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

相关文章

软考高级架构师笔记-3数据库

目录 1. 前言 & 更新2. 数据库基本概念3. E-R图与二维表4. 约束、范式5. 数据库新技术1. 前言 & 更新 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔记-2计算机软件(操作系统)本章考情: 数据库章节都会考3-5分左右,第二版教材上对应2.3.3和6,主要考…

软考A计划-真题-分类精讲汇总-第十四章(数据流图)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

Python每日一练(20230517) 最大连续1的个数 I\II\III

目录 1. 最大连续1的个数 I Max Consecutive Ones &#x1f31f; 2. 最大连续1的个数 II Max Consecutive Ones &#x1f31f;&#x1f31f; 3. 最大连续1的个数 III Max Consecutive Ones &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; G…

RabbitMQ养成记 (5. MQ的topics模式)

主题模式 Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符&#xff01; Routingkey 一般都是有一个或多个单词组成&#xff0c;多个单词之间以”.”分割&a…

【夜莺(Flashcat)V6监控】2.夜莺告警相关: 多服务器多业务配置

介绍 本章侧重点是应用&#xff0c;根据大家不同业务、服务器部署众多等等&#xff1b;根据不同团队&#xff0c;不同业务进行划分&#xff1b;方便不同的团队负责自己职责内的工作&#xff1b; 比如我们场景如下&#xff1a; 三块业务&#xff1a;人工智能、医药、团购&…

分层强化学习 学习笔记

分层强化学习代码汇总 0.综述 《The Promise of Hierarchical Reinforcement Learning》分层强化学习的前景 强化学习 强化学习问题的设置&#xff1a; 有两个主角&#xff1a;一个代理和一个环境。环境是代理所生活和交互的地方。在每一次交互中&#xff0c;代理都能看到世…

深度解析:5G与未来天线技术 5G通信到底需要什么样的天线?

过去二十年&#xff0c;我们见证了移动通信从1G到4G LTE的转变。在这期间&#xff0c;通信的关键技术在发生变化&#xff0c;处理的信息量成倍增长。而天线&#xff0c;是实现这一跨越式提升不可或缺的组件。 按照业界的定义&#xff0c;天线是一种变换器&#xff0c;它把传输…

一图看懂 et_xmlfile 模块:一个用于创建大型XML文件的低内存库,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 et_xmlfile 模块&#xff1a;一个用于创建大型XML文件的低内存库&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&#x1f9ca;解释&#x1f9ca…

网络进阶学习:子网掩码及VLAN划分

网络进阶学习&#xff1a;子网掩码及VLAN划分 什么是子网&#xff1f;什么是子网掩码&#xff1f;什么是VLAN子网掩码和VLAN的关系小结 什么是子网&#xff1f; ⭐子网是将一个大的IP地址段划分成若干个小的IP地址段的网络。子网可以帮助网络管理员更好地管理网络&#xff0c;…

reids学习--redis常用命令

字符串string操作命令 Redis中字符串类型常用命令&#xff1a; 操作描述set key value设置指定key的值get key获取指定key的值setex key seconds value设置指定key的值&#xff0c;并将key的过期时间设为seconds秒(可用于验证码登录)setnx key value只有在key不存在时设置key…

玩转SAM语义分割之(2)显示特定的图片

文章目录 1. 使用matplotlib显示出完整彩色的掩码&#xff0c;并将其保存下来 2. 使用matplotlib显示出单张掩码&#xff0c;只保存面积大于一个阈值的掩码图片3. 对一整个文件夹中的图片进行处理&#xff0c;只保存面积大于一定阈值的掩码图片4. 查看特定坐标点处是否有mask掩…

Go语言的并发:goroutine和channel

目录 【Go 的并发方案&#xff1a;goroutine】 goroutine 的基本用法 【通道channel】 创建channel&#xff1a; 发送与接收变量&#xff1a; 关闭channel&#xff1a; 【channel的类型】 无缓冲channel和带缓冲channel 无缓冲channel 带缓冲channel nil channel 单…

随便聊聊 顺便晒一下我的听歌设备

平时最大的爱好就是听歌了&#xff0c;我平时的听歌类型挺多元化的&#xff0c;硬要说的话更偏向 Jpop、ACG、女声、轻音乐、大编制、交响乐&#xff0c;当然好听的都听不局限于类型。 又是30天一天不落O(∩_∩)O&#x1f604; 作为一个音乐爱好者&#xff0c;在听歌设备上面花…

Liunx压缩命令 - zip

zip命令 – 压缩文件 zip命令的功能是用于压缩文件&#xff0c;解压命令为unzip。通过zip命令可以将文件打包成.zip格式的压缩包&#xff0c;里面会包含文件的名称、路径、创建时间、上次修改时间等等信息&#xff0c;与tar命令相似。 语法格式&#xff1a;zip 参数 目标文件…

MySQL高级_第04章_逻辑架构

MySQL高级_第04章_逻辑架构 1. 逻辑架构剖析 1.1 服务器处理客户端请求 那服务器进程对客户端进程发送的请求做了什么处理&#xff0c;才能产生最后的处理结果呢&#xff1f;这里以查询请求为例展示&#xff1a; 下面具体展开看一下&#xff1a; 1.2 Connectors 1.3 第1…

Go 本地缓存 bigcache

​本地缓存已经算是数据库的常规设计了&#xff0c;因为数据直接缓存在机器内存中&#xff0c;避免昂贵的IO开销&#xff0c;数据的读取和写入快到不可思议。本地缓存常驻在内存中&#xff0c;就好像业务逻辑中声明的全局变量一样&#xff0c;不会被垃圾回收。但本地内存也会导…

JavaScript:new操作符

一、new操作符的作用 用于创建一个给定构造函数的实例对象 new操作符创建一个用户定义的对象类型的实例 或 具有构造函数的内置对象的实例。二、new一个构造函数的执行过程 2.1、创建一个空对象obj 2.2、将空对象的原型与构造函数的原型连接起来 2.3、将构造函数中的this绑定…

CPU的功能和组成

CPU的功能和组成 CPU是控制计算机自动完成取指令和执行指令任务的部件&#xff0c;是计算机的核心部件、简称CPU 功能&#xff1a; 指令控制&#xff1a;对程序的顺序控制也是对指令执行的顺序控制&#xff08;PC、JMP&#xff09;操作控制&#xff1a;产生各种操作信号&…

2023.05.17-使用Vizzy进行音乐的可视化

文章目录 1. 简介2. 官网3. 使用3.1. 进行音乐可视化 1. 简介 Vizzy是MusicVid创作者的另一个在线音乐可视化工具。虽然这款应用还处于Alpha版本&#xff0c;但Vizzy相当令人印象深刻&#xff0c;绝对值得一试。Vizzy支持动画文本对象、频谱、图像和效果。工具集的最突出的功能…

基础篇007. 串行通信(二)--中断方式接收数据

目录 1. 实验任务 2. 硬件原理 3. 利用STM32CubeMX创建MDK工程 3.1 STM32CubeMX工程创建 3.2 配置调试方式 3.3 配置时钟电路 3.4 配置GPIO 3.5 配置串口参数 3.6 配置时钟 3.7 项目配置 4. 串行通信实验 4.1 UART串口printf&#xff0c;scanf函数串口重定向 4.2 …