剑指offer全集系列Java版本(2)

目录

反转链表

替换空格

二叉树

链表的中间结点

附录

StringBuffer类中常用的方法 


反转链表

反转链表_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=265&tqId=39226&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D265&difficulty=undefined&judgeStatus=undefined&tags=&title=

解法1: 使用堆栈

        思路如下, 首先创建一个堆栈, 然后依次遍历链表, 将链表的结点依次存入堆栈, 然后新建一个链表然后依次弹出结点, 让后将此弹出的结点, 尾插到新链表的尾部

时间复杂度: O(n)
空间复杂度: O(n)

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode ReverseList (ListNode head) {
        if (head == null) {
            return null;
        }
        // write code here
        Stack<Integer> stack = new Stack<>();
        ListNode newHead = new ListNode(0);
        ListNode result = newHead;
        while(head != null) {
            stack.push(head.val);
            head = head.next;
        }
        while(!stack.isEmpty()) {
            newHead.val = stack.pop();
            if (stack.isEmpty()) {
                break;
            }
            ListNode tem = new ListNode(0);
            newHead.next = tem;
            newHead = newHead.next;
        }
        return result;

    }
}

 解法2: 依次遍历

        使用多指针的方法, 依次将结点的next赋值为他的前一个结点, 然后往后遍历.

时间复杂度: O(n)
空间复杂度: O(1)

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode ReverseList (ListNode head) {
        if (head == null) {
            return null;
        }
        if (head.next == null) {
            return head;
        }
        // write code here
        ListNode l = head;
        
        ListNode center = head.next;
        ListNode r = center.next;

        l.next = null;
        while (center != null) {
            center.next = l;
            l = center;
            center = r;
            if (r == null) {
                return l;
            }
            r = r.next;
        }
        return null;


    }
}

 解法3: 递归

        使用递归的方法来遍历这个集合, 这种方法类似于使用堆栈的方法 , 虽然代码少了很多, 但是代码的可读性缺不高, 非常锻炼玩家的思维能力.

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode ReverseList (ListNode head) {
        // write code here
        if (head == null || head.next == null) {
            return head;
        }
        ListNode next = head.next;
        ListNode reverse  = ReverseList(next);
        next.next = head;
        head.next = null;
        return reverse;
    }
}

        需要注意的是, 如果调用过多的递归, 会导致函数调用栈溢出的情况.

替换空格

        题目中给出的字符串为一个StringBuffer字符串, 他是线程安全的字符串, 同时也可以对其进行修改的字符串(我们知道java中String类是不能修改的) 

        在做题之前 , 我们首先应该去了解String类和StringBuffer, 和StringBuilder中提供了哪些方法供我们使用, 我将其整理在了后面的附录中, 可以点击目录查看.

我们有很多种实现的方法, 例如:

解法1: 新建一个StringBuffer字符串

        新建一个StringBuffer对象, 以此扫描str, 如果不是空格, 就直接追加字符到新的字符串中, 如果是空格, 就将%20追加到新的字符串中, 然后返回他的toString方法的返回值就行.

import java.util.*;
public class Solution {
    public String replaceSpace(StringBuffer str) {
    	StringBuffer strb = new StringBuffer();
        for(int i = 0; i < str.length(); i++) {
            char tem = str.charAt(i);
            if (tem == ' ') {
                strb.append("%20");
            } else {
                strb.append(tem);
            }
        }
        return strb.toString();
    }
}

  解法2: delete(deleteCharAt) + insert

        直接遍历str, 如果是空格就先将其删除然后, 再插入%20

import java.util.*;
public class Solution {
    public String replaceSpace(StringBuffer str) {
    	for (int i = 0; i < str.length(); i++) {
            char tem = str.charAt(i);
            if (tem == ' ') {
                str.deleteCharAt(i);
                str.insert(i,"%20");
            }
        }
        return str.toString();
    }
}


二叉树

        树是一种逻辑结构,同时也是一种分层结构,

其定义结构如下: 

  • 有且仅有一个特定的点可以做为根节点
  • 树的根节点是没有前驱的
  • 树的所有结点可以有0个或者是多个后继
  • 特殊的,我们将每个父亲最多只有两个孩子的树叫做二叉树

二叉树有什么特点?? 

 二叉树的结构代码定义:

#include<stdio.h>
#include<malloc.h>

typedef char ElementType;
typedef struct BNode {
	ElementType data;
	struct BNode* left;
	struct BNode* right;
}BNode,*BTree;

 辅助队列:

typedef struct tag {
	BiTree p;
	struct tag* next;
}tag_t,*ptag_t;

建树的过程:

#define _CRT_SECURE_NO_WARNINGS 1


#include<stdio.h>
#include<malloc.h>

typedef char ElementType;
typedef struct BNode {
	ElementType data;
	struct BNode* left;
	struct BNode* right;
}BNode,* BiTree;

typedef struct tag {
	BiTree p;
	struct tag* next;
}tag_t,*ptag_t;

int main() {
	BiTree pnew;   // 树的新的结点
	BiTree tree = NULL; // 树根
	ptag_t phead = NULL, ptail = NULL, listpnew = NULL, pcur = NULL;
	char c;
	while (scanf("%c", &c)) {
		if (c == '\n') {
			break;
		}
		pnew = (BiTree)calloc(1, sizeof(BNode));
		pnew->data = c;
		listpnew = (ptag_t)calloc(1, sizeof(tag_t));
		listpnew->p = pnew;

		if (NULL == tree) {
			tree = pnew;
			phead = listpnew;
			ptail = listpnew;
			pcur = listpnew;
		}
		else {
			ptail->next = listpnew;
			ptail = listpnew;
			if (pcur->p->left == NULL) {
				pcur->p->left = pnew;
			}
			else if (pcur->p->right == NULL	){
				pcur->p->right = pnew;
				pcur = pcur->next;
			}

		}
	}

	return 0;
}

        树是一种简单的数据结构, 面试中提到的树一般都是二叉树, 也就是一种特殊的树结构, 根节点没有父结点. ,每个结点有一到两个子节点, 树存在着好几种遍历方式, 一般有:

  • 前序遍历: 先访问根节点, 再访问左子节点, 然后再访问右子节点
  • 中序遍历: 先访问左子节点, 然后访问根节点, 随后访问右子节点
  • 后序遍历: 先访问左子节点, 然后访问右子节点, 最后访问根节点

前中后序遍历的实现(递归实现) :

前序遍历:

        以上这三种遍历方式的六种实现应该了如指掌

        接下来看这三个遍历的例子:

void preOrder(BiTree root) {
	if (root == NULL) {
		return;
	}
	printf("%c", root->data);
	preOrder(root->left);
	preOrder(root->right);
}

void inOrder(BiTree root) {
	if (root == NULL) {
		return;
	}
	inOrder(root->left);
	printf("%c", root->data);
	inOrder(root->right);
}

void lastOrder(BiTree root) {
	if (root == NULL) {
		return;
	}
	lastOrder(root->left);
	lastOrder(root->right);
	printf("%c", root->data);
}

  • 宽度优先遍历: 先访问第一层的结点, 在访问第二层的结点, 每一层就时从左到右以此访问.

广度优先遍历的代码:

广度优先遍历需要借助一个辅助队列, 如下:

void levelOrder(BiTree root) {
	SqQueue queue; // 辅助队列
	InitQueue(queue); // 初始化一个队列.
	EnQueue(queue, root);  // 将根节点首先放入队列
	while (!isEmpty(queue)) {
		BiTree tem;
		DeQueue(queue,tem);  // 出队一个元素.
		printf("%c", tem->data); // 
		if (tem->left != NULL) {  // 如果左孩子不为空, 就将左孩子入队
			EnQueue(queue, tem->left);
		}
		if (tem->right != NULL) { // 如果右孩子不为空, 就将右孩子入队
			EnQueue(queue, tem->right);
		}
	}
}

带权路径之和:

带权路径之和为每个叶子结点的深度(路径长度)和其权值的乘积..

#define _CRT_SECURE_NO_WARNINGS 1


#include<stdio.h>
#include<malloc.h>

typedef struct BNode {
	char data;
	struct BNode* left;
	struct BNode* right;
}BNode, * BiTree;


typedef struct tag {
	BiTree p;
	struct tag* next;
}tag_t, * ptag_t;


int wpl = 0;
int wpl_preOrder(BiTree root, int deep) {
	if (root == NULL) {
		return;
	}
	if (root->left == NULL && root->right == NULL) {
		wpl += deep * (root->data);
	}
	printf("%c", root->data);
	wpl_preOrder(root->left, deep + 1);
	wpl_preOrder(root->right, deep +1);
	return wpl;
}

int WPL(BiTree root) {
	wpl = 0;
	return wpl_preOrder(root, 0);
}

链表的中间结点

题目链接: 

链表的中间结点_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/d0e727d0d9fb4a9b9ff2df99f9bfdd00?tpId=196&tqId=40336&ru=/exam/oj

实例 

        通过例子可以知道, 加入链表有技术个数, 那么中间结点就为中间那个数, 如果为偶数个, 那么中间结点就有两个, 例如{1,2,3,4}, 中间结点为2和3, 但是我们认为中间结点为3, 于是返回3的地址.

        思路:  使用快慢指针 定义连个指针, 他们刚开始都指向头结点, 分别为slow指针和fast指针, 定义: slow指针每次只走一个结点, fast指针每次走两个结点.

经过第一次slow走一步, fast走两步:

然后再走一次, 结果如下:

        此时, fast指向NULL, slow刚好指向了中间这个结点

假设现在有奇数个结点, 如下:

        现在slow走一步, fast走两步

第一次:

 第二次:

        此时, fast的next为空时, slow指向中间结点

总结, 上面两种情况, 无论是奇数个结点还是偶数个结点, 只要fast的next为NULL或者fast本身为NULL的时候, slow就会指向中间结点. 

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @return ListNode类
 */
struct ListNode* middleNode(struct ListNode* head ) {
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

附录

StringBuffer类中常用的方法 

    • Modifier and TypeMethod and Description
      StringBufferappend(boolean b)

      boolean参数的字符串表示附加到序列中。

      StringBufferappend(char c)

      char参数的字符串表示附加到此序列。

      StringBufferappend(char[] str)

      char数组参数的字符串表示附加到此序列。

      StringBufferappend(char[] str, int offset, int len)

      char数组参数的子阵列的字符串表示附加到此序列。

      StringBufferappend(CharSequence s)

      追加指定的 CharSequence到这个序列。

      StringBufferappend(CharSequence s, int start, int end)

      追加指定的序列 CharSequence到这个序列。

      StringBufferappend(double d)

      double参数的字符串表示附加到此序列。

      StringBufferappend(float f)

      float参数的字符串表示附加到此序列。

      StringBufferappend(int i)

      int参数的字符串表示附加到此序列。

      StringBufferappend(long lng)

      long参数的字符串表示附加到此序列。

      StringBufferappend(Object obj)

      追加 Object参数的字符串表示。

      StringBufferappend(String str)

      将指定的字符串附加到此字符序列。

      StringBufferappend(StringBuffer sb)

      将指定 StringBuffer这个序列。

      StringBufferappendCodePoint(int codePoint)

      codePoint参数的字符串表示法附加到此序列。

      intcapacity()

      返回当前容量。

      charcharAt(int index)

      返回 char在指定索引在这个序列值。

      intcodePointAt(int index)

      返回指定索引处的字符(Unicode代码点)。

      intcodePointBefore(int index)

      返回指定索引之前的字符(Unicode代码点)。

      intcodePointCount(int beginIndex, int endIndex)

      返回此序列指定文本范围内的Unicode代码点数。

      StringBufferdelete(int start, int end)

      删除此序列的子字符串中的字符。

      StringBufferdeleteCharAt(int index)

      删除 char在这个序列中的指定位置。

      voidensureCapacity(int minimumCapacity)

      确保容量至少等于规定的最小值。

      voidgetChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

      字符从该序列复制到目标字符数组 dst

      intindexOf(String str)

      返回指定子字符串第一次出现的字符串内的索引。

      intindexOf(String str, int fromIndex)

      返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。

      StringBufferinsert(int offset, boolean b)

      在此序列中插入 boolean参数的字符串表示形式。

      StringBufferinsert(int offset, char c)

      在此序列中插入 char参数的字符串表示形式。

      StringBufferinsert(int offset, char[] str)

      在此序列中插入 char数组参数的字符串表示形式。

      StringBufferinsert(int index, char[] str, int offset, int len)

      在此序列中插入 str数组参数的子阵列的字符串表示形式。

      StringBufferinsert(int dstOffset, CharSequence s)

      将指定的 CharSequence这个序列。

      StringBufferinsert(int dstOffset, CharSequence s, int start, int end)

      将指定的子序列 CharSequence这个序列。

      StringBufferinsert(int offset, double d)

      在此序列中插入 double参数的字符串表示形式。

      StringBufferinsert(int offset, float f)

      在此序列中插入 float参数的字符串表示形式。

      StringBufferinsert(int offset, int i)

      将第二个 int参数的字符串表示插入到此序列中。

      StringBufferinsert(int offset, long l)

      在此序列中插入 long参数的字符串表示形式。

      StringBufferinsert(int offset, Object obj)

      Object参数的字符串表示插入到此字符序列中。

      StringBufferinsert(int offset, String str)

      将字符串插入到此字符序列中。

      intlastIndexOf(String str)

      返回指定子字符串最右边出现的字符串内的索引。

      intlastIndexOf(String str, int fromIndex)

      返回指定子字符串最后一次出现的字符串中的索引。

      intlength()

      返回长度(字符数)。

      intoffsetByCodePoints(int index, int codePointOffset)

      返回此序列中与 indexcodePointOffset代码点偏移的索引。

      StringBufferreplace(int start, int end, String str)

      用指定的String中的字符替换此序列的子字符串中的 String

      StringBufferreverse()

      导致该字符序列被序列的相反代替。

      voidsetCharAt(int index, char ch)

      指定索引处的字符设置为 ch

      voidsetLength(int newLength)

      设置字符序列的长度。

      CharSequencesubSequence(int start, int end)

      返回一个新的字符序列,该序列是该序列的子序列。

      Stringsubstring(int start)

      返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。

      Stringsubstring(int start, int end)

      返回一个新的 String ,其中包含此序列中当前包含的字符的子序列。

      StringtoString()

      返回表示此顺序中的数据的字符串。

      voidtrimToSize()

      尝试减少用于字符序列的存储。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

思谋科技进博首秀:工业多模态大模型IndustryGPT V1.0正式发布

大模型技术正在引领新一轮工业革命&#xff0c;但将其应用于工业制造&#xff0c;仍面临许多挑战&#xff0c;专业知识的缺乏是关键难点。11月5日&#xff0c;香港中文大学终身教授、思谋科技创始人兼董事长贾佳亚受邀参加第六届中国国际进口博览会暨虹桥国际经济论坛开幕式。虹…

SAP 使用函数创建多个备选BOM ( 改造标准函数 : CSAP_MAT_BOM_MAINTAIN 和 CSAP_MAT_BOM_CREATE )

参考博客1&#xff1a;https://blog.csdn.net/Buffalo_soldier/article/details/117956986 参考博客2&#xff1a;https://blog.csdn.net/u014535256/article/details/111539629 RFC CSAP_MAT_BOM_MAINTAIN 改造 SAP标准函数CSAP_MAT_BOM_MAINTAIN可以增删改BOM&#xff0c;但是…

Android JVM内存模型——老生常谈

jvm简介 JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 jvm作用 Java中的所有类&#xff0c;必须…

循环链表的设计与基本操作的实现

目录 一.循环链表的设计 二.循环链表的实现 三.循环链表的总结 一.循环链表的设计 1.循环链表的结构设计: typedef struct CNode{int data;struct CNode* next;}CNode ,*CList; 2.循环链表的示意图: 3.循环链表和单链表的区别: 唯一区别,没有空指针,尾节点的后继为头,为循…

OpenAI开发者大会之后,当何去何从?

简介 过往总结 ​产品升级 GPT-4 Turbo Agent化 此间的未来 定制GPT GPT商店 Assistants API 总结与思考 简介 此次发布会简单总结如下。 1. 发布GPT-4 Turbo&#xff1a; 更长。支持128K上下文输入&#xff0c;标准GPT-4是8K版本&#xff0c;之前升级出了32K版本 更…

TensorFlow学习笔记--(2)张量的常用运算函数

张量的取值函数 求张量的平均值: tf.reduce.mean(%张量名%)求张量的最小值:tf.reduce_min(%张量名%)求张量的最大值:tf.reduce_max(%张量名%)求张量的和:tf.reduce_sum(%张量名%)其次,对于上述所有操作 都可在函数后添加一个新的参数 axis%维度% axis0 代表第一维度 axis1 代表…

文件加密软件怎么用(附2种解密破解工具)

有时候出差或者有些商务场合&#xff0c;需要对一些敏感文件做一下简单的加密&#xff0c;这样在分享内容的时候&#xff0c;可以起到初步的保护作用。 当然了&#xff0c;如果文件非常重要&#xff0c;涉及到一些商业机密&#xff0c;这个时候你需要使用专业的加密工具&#x…

什么是代理IP池?如何判断IP代理商的IP池是否真实优质?

代理池充当多个代理服务器的存储库&#xff0c;提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务&#xff0c;而无需担心被检测或阻止的风险。代理池为各种在线活动&#xff08;例如网页抓取、安全浏览等&#xff09;提高后勤保障。 读完…

机器学习基础之《回归与聚类算法(5)—分类的评估方法》

问题&#xff1a;上一篇的案例&#xff0c;真的患癌症的&#xff0c;能被检查出来的概率&#xff1f; 一、精确率和召回率 1、混淆矩阵 在分类任务下&#xff0c;预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合&#xff0c;构成混淆矩阵(适…

【Python自学笔记】python os.getcwd文件目录找不对

写小组项目的时候需要按照路径读入数据表&#xff0c;数据库和图片列表显示到html&#xff0c;按ChatGPT的答案写了python os.getcwd()&#xff0c;结果迁移到同组同学的电脑上总是报错。 经过一番查询&#xff0c;在CSDN上发现一个完美解决问题的好帖&#xff0c;特此存下链接…

订水商城实战教程09-跑马灯

目录 1 跑马灯效果2 创建数据源3 创建变量4 搭建组件5 数据绑定6 录入测试数据总结 上一篇我们介绍了轮播图如何开发&#xff0c;本节我们介绍一下跑马灯的效果开发。 1 跑马灯效果 通常小程序会增加一点动画的效果来让页面显得不那么死板&#xff0c;我们这里增加了一个跑马灯…

ChatGPT生产力|中科院学术ChatGPT优化配置

资源链接&#xff1a;GitHub - binary-husky/gpt_academic b站配置讲解链接&#xff1a;chatgpt-academic 新手运行官方精简指南&#xff08;科研chatgpt拓展&#xff09; 某知配置图文讲解&#xff1a;图文详解&#xff1a;在windows中部署ChatGPT学术版 - 知乎 (zhihu.com) 一…

统计一个只包含大写字母的字符串中顺序对的数量.其中顺序对的定义为前面的字符小后面的字符大.例如在“ABC“中的顺序对为3,因为有AB,AC,BC

哈希法&#xff1a;扫描字符串&#xff0c;将出现的字符次数加1&#xff0c;统计比当前字符字典序小的字母出现的次数&#xff0c;即为顺序串的个数。 int CounSq(const char* arr)//时间复杂度O&#xff08;n&#xff09; {int sig[26] { 0 };int index 0;int sum 0;for (…

微信小程序:js实现不改变原数组的情况下增加一条对象到新数组中

效果 核心 old_array.slice(0) 表示对 old_array 这个数组进行切片操作&#xff0c;从索引 0 开始&#xff08;包括索引 0&#xff09;&#xff0c;直到数组的末尾&#xff0c;old_array.slice(0) 中的 0 表示开始切片的索引位置&#xff0c;而由于没有传入第二个参数&#xff…

蓝桥杯每日一题2023.11.6

取位数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由题意我们知道len中为现阶段长度&#xff0c;如果其与k相等也就是找到了正确的位数&#xff0c;否则就调用递归来进行搜索&#xff0c;每次搜索一位数。 #include <stdio.h> // 求x用10进制表示时的数位长度 int …

【MATLAB源码-第72期】基于matlab的OFDM-IM索引调制系统在高斯,瑞利,莱斯信道误码率对比,对比传统OFDM系统。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM-IM索引调制技术是一种新型的无线通信技术&#xff0c;它将正交频分复用&#xff08;OFDM&#xff09;和索引调制&#xff08;IM&#xff09;相结合&#xff0c;以提高频谱效率和系统容量。OFDM-IM索引调制技术的基本思想…

Vscode禁止插件自动更新

由于电脑的vscode版本不是很新。2022.10月份的版本1.7.2&#xff0c;电脑vscode的python插件装的也是2022年4月份的某个版本&#xff0c;但插件经常自动更新&#xff0c;导致python代码无法Debug,解决办法&#xff1a; 点设置&#xff0c;搜autoUpdate, 把红色框选成无

12、填写NGINX配置部署前端;运行jar部署后端

后端可以部署的方式&#xff0c;首先直接运行jar是肯定可以的。此外&#xff0c;可以单独开docker容器运行在容器中。 但是这里运行在容器中必要性&#xff0c;其实并不大。 当前我们直接运行jar来运行后端。后面推出集成docker。 直接运行jar包的方式&#xff0c;首先需要打…

Vue 3 相对于 Vue2,模板和组件的一些变化

目录 1&#xff0c;模板的变化1&#xff0c;v-modelvue2vue3 2&#xff0c;v-if 和 v-for3&#xff0c;keyv-forv-if 4&#xff0c;Fragment 2&#xff0c;组件的变化1&#xff0c;Teleport2&#xff0c;异步组件 1&#xff0c;模板的变化 1&#xff0c;v-model vue2 对组件…