2021-7-23-Holiday23

发布时间 2023-09-17 20:42:08作者: Yecgaa1
layout: post
title: xtx暑假第二三周日志
categories: 日志
tags: 
    - 日志 
    - 2021暑期日志
BGImage: 'https://github.xutongxin.me/https://raw.githubusercontent.com/xutongxin1/PictureBed/master/img0/20210904201804.png'
jekyll-theme-WuK:
    musicid: '41631040'

这是接下来23(4)周的日志了,原因就是电赛嘛,电赛的笔记是写在另一个markdown里的。所以这个日志就是记录除了电赛外所做的努力了,不过确实很少就是了。

线程池

7.19

继续整理零件准备焊接

7.20

因病休息

7.21

焊飞机的烧录线,搭架子

7.22

测试飞机的自动模式和位置锁定模式

7.23

超声波安装,调试,改写uart7驱动

7.24

向上光流测试(炸鸡现场)

7.25

休息

7.26 27

向上光流测试(炸鸡现场x2)x3

7.28

外部无遥控启动

至此全准备工作完成

然后由于的原因

弃赛

在接下来一周不定时间处理技术问题

7.29~8.3

模板都和泛型相关

模板函数

template <typename T> inline T const& Max (T const& a, T const& b)  {     return a < b ? b:a;  } 

https://blog.csdn.net/fightingforcv/article/details/51472586 泛型传入,此时T是传入的类型,如int,用于在模板函数定义时使用,如(T a)==(int a)

const&

inline https://www.runoob.com/w3cnote/cpp-inline-usage.html减少重复对简单函数调用所带来的堆栈空间消耗

模板类

template <class T>
class Stack { 
  private: 
    vector<T> elems;     // 元素 
 
  public: 
    void push(T const&);  // 入栈
    void pop();               // 出栈
    T top() const;            // 返回栈顶元素
    bool empty() const{       // 如果为空则返回真。
        return elems.empty(); 
    } 
}; 

泛型传入,此时T是传入的类型,如int,用于在模板类中做函数定义时使用,如(T a)==(int a)

异常处理,与python类似

try
{
   // 保护代码
}catch( ExceptionName e1 )
{
   // catch 块
}catch( ExceptionName e2 )
{
   // catch 块
}catch( ExceptionName eN )
{
   // catch 块
}

clion和leetcode配置

https://www.jianshu.com/p/04343d6be97e

最终模板方案:

${question.content}

\#include <iostream>
\#include <vector>

using namespace std;

${question.code}

int main()
{
    Solution s;
    cout<<"Hello LeetCode"<<endl;
}

Leetcode第一题
证明30%人和我一样用了低级的时间复杂度高的算法,70%人用了更快但空间开销更大的算法,还有4%的在摸鱼()

8.4

构造函数种类

https://blog.csdn.net/zxc024000/article/details/51153743

public:
	Student(int n,int a):num(n),age(a){} //构造函数 传入参数 : 赋值参数 函数内容
private:
	int num;
	int age;

nullptr

空指针常量值,如这样用

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) {}
    };

链表创建

光看不用问题大得很,前插法

#include <iostream>

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) {}
};

int main() {
    std::cout << "Hello, World!" << std::endl;
    int v1[3]={1,2,3};
    int v2[3]={1,2,3};

    ListNode *l1=new ListNode();
    ListNode *l2=new ListNode();
    l1->next=NULL;
    for(int i=0;i<3;i++)
    {
        ListNode *p=new ListNode(v1[i]);
        p->next=l1->next;//挤到后面去,对于第一次,将p作为末节点
        l1->next=p;
    }


    return 0;
}

image-20210804134350180

这是新建一个元素前插入,但是要插到最后面嘛

#include <iostream>

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) {}
};

int main() {
    std::cout << "Hello, World!" << std::endl;
    int v1[3]={1,2,3};
    int v2[3]={1,2,3};

    ListNode *l1=new ListNode();
    ListNode *l2=new ListNode();
    ListNode *last=l1;//上一个被插入的元素
    l1->next=NULL;
    for(int i=0;i<3;i++)
    {
        ListNode *p=new ListNode(v1[i]);
        last->next=p;//指向新的元素
        last=p;//新的元素作为上个被插入的元素
    }


    return 0;
}

也可以这样写

for(int i=0;i<3;i++)
{
	p->next=new ListNode(0);
    p=p->next;
 }

8.5

对链表的next,到底是赋值地址还是赋值指针非常重要

(注:本节笔记含有自行理解且不完全确认理解是否透彻而正确的内容)

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) {}
};

int v1[3]={1,2,3};
int v2[3]={1,2,3};
Solution s;
ListNode l1,l2,p;
l1=*new ListNode;
l2=*new ListNode;
l1.next=NULL;
for(int i=0;i<sizeof(v1);i++)
{
    p=*new ListNode(v1[i]);
    p.next=l1.next;//挤到后面去,对于第一次,将p作为末节点
    l1.next=&p;
}

得到的结果也是很惊人,清一色的重复引用

image-20210805005128684

关键就在

p=*new ListNode(v1[i]);
和
l1.next=&p;

如果按照书里的写法

image-20210805005411585

image-20210805005519128

可以看到书上是把指针赋值给了next,而我是把变量的地址赋值给了next

而且书上在new空间时是返回了一个指针而不是变量

所以我每一次把地址不断赋值给p的next,而p只是变量,p的地址从未改变,所以就闭环了

因此有句话特别重要

typedef struct ListNode *List;

但不行,这样转换后构造函数就用不了了,即便是这样写

ListNode* l1,*l2,*p;
*l1=new ListNode;
*l2=new ListNode;

也不行,因为题目中包含了构造函数,而我先声明在分配空间会报错

ListNode* l1,*l2,*p;
*l1=*new ListNode;
*l2=*new ListNode;

这样也不行,在执行阶段会出分配内存错误

所以应该这样写

ListNode *l2=new ListNode();

创建时分配空间顺带做构造函数

sizeof()

获取的是空间大小不是元素数量

对于int需要的话要

int a[10];
int b=sizeof(a)/4  //b=10

或者

int a[10];
int *pbeg = begin(arr);

int *pend = end(arr);

auto length = pend - pbeg;*//数组元素个数

8.6~8.8

动态规划两个要点:

空间换时间来节省重复的运算

状态转移方程

后者的通常格式为:max(前一状态+现状态,现状态)

可参见的题目:

最大子序列:

https://leetcode-cn.com/problems/maximum-subarray

(优秀解释:https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-cshi-xian-si-chong-jie-fa-bao-li-f/)

背包问题:https://www.bilibili.com/video/BV1XD4y1S7nv

![img](file:///C:\Users\xtx\Documents\Tencent Files\2656823393\Image\Group2\3X\0U\3X0U`405_CUKQK[WHQ${M$E.jpg)