2.22

1.数据为什么放文件里或者数据库里,放在内存中不行吗?

如果是定期更新的,一段时间内都在使用,放在内存中可以的,速度更快的。

2.说说C++的4种类型转换

C++的四种类型转换reinterpret_cast/const_cast/static_cast /dynamic_cast

3.C++里map的底层实现的方式,unordered_map和map插入一个数据的复杂度对比

map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。


unordered_map: unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。哈希表详细介绍

unordered_map以前就是hash_map,结合了hashtable的一个结构。

unordered_map内部是非排序的、map是排序了的。unordered_map插入一个数据的复杂度是O(1)map插入一个数据的复杂度是O(logn),插入n个元素的话复杂度是O(nlogn)。

map和unordered_map的差别和使用

4.在Linux上一个电话本文件里查找指定手机号码

可以Shell依次读每一行然后对比即可。或者使用grep。

3.2

1.虚拟存储

一定要提到  程序的局部性原理 

2.rand7()产生rand10()的随机数

470. Implement Rand10() Using Rand7()

3.计算100的阶乘

C++ 求100的阶乘

3.4

1.tcp四次挥手

tcp建立连接为什么需要三次握手,四次挥手过程

这个我讲的没错,就是4次,A和B双方各自一来一回,面试官说我说的不对,我紧张了,应该再和他问清楚的,这个问题我是知道的。紧张了紧张,应该把这个问题问清楚,面试说我说的不对,但我是知道的。

他说A先发FIN报文,最后谁会ACK,我说B肯定要回ACK,但如果说4次挥手,最后谁发ACK,那肯定还是A发。这里应该和他说清楚的,有点后悔,他以为我不懂。

2.进程间通讯方式

我只回答出了:管道,消息队列,信号量,共享内存,少了个socket通信。

(1) 半双工Unix管道
(2) FIFOs(命名管道)
(3) 消息队列
(4) 信号量
(5) 共享内存
(6) 网络Socket

另外他问哪种方式效率最高,应该是指速度,我说共享内存,应该是没说错。

几种方式的比较:

管道:速度慢,容量有限
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
信号量:不能传递复杂消息,只能用来同步
共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了一块内存的。

3.InnoDB的索引方式

这块我确实不懂,MySQL的InnoDB索引原理详解,但这个确实没怎么用过和了解过,再看看吧。这篇文章也不错阿里一面,给了几条SQL,问需要执行几次树搜索操作?

InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。

MySQL索引原理,一篇从头到尾讲清楚

4.计算一个浮点数double的幂次方,考虑边界情况。 优化

主要边界就是:0的小于等于0的次方,都是非法的,应该报错

计算一个浮点数double的幂次方,好好品品

额外的点:

a.非法情况用C++的异常处理机制,我说打印出一句话,这样是不行的,因为如果在没有屏幕的机器或者没有输出,面试官说CPU上。但是异常是个好东西,我直接printf肯定也是能看出来的,如果输出一句话都看不到,那肯定是不可能的,但是用异常机制是很专业的,没问题。C++异常怎么写

b.double在内存中具体是怎么存放的

浮点数double在内存中的存储方式

5.实现一种数据结构,先进后出,入和出,以及取最小值,时间复杂度都是O(1)。

才发现这题我2019年做过Leetcode 155. Min Stack实现一个栈,要求实现出栈,入栈,返回最小值的操作,时间复杂度为O(1)

实现一个栈,要求实现出栈,入栈,返回最小值的操作,时间复杂度为O(1)。这题如果改成返回最大值,也是一个道理,维持一个最大栈,每次压入元素A,Amax栈顶元素大大,就压入max栈。

3.5

1.操作系统为什么要引入虚拟地址?

深入探究:操作系统为什么要引入虚拟地址?

2.快速排序的复杂度说一说

3.说说中断

4.键盘按下字母‘a'到屏幕上显示字母'a'发生了什么?

键盘敲入 A 字母时,期间发生了什么....

3.8

1.数据库事务的基本要素

数据库事务具有4个特征,分别是原子性、一致性、隔离性和持久性,简称事务的ACID特性;

数据库事务具有4个特征,分别是原子性一致性隔离性持久性,简称事务的ACID特性;

2.为什么要有中断

如果让内核定期对设备进行轮询,以便处理设备,那会做很多无用功,因为外设的处理速度一般慢于CPU,而CPU不能一直等待外部事件。所以能让设备在需要内核时主动通知内核,会是一个聪明的方式,这便是中断。

3.Linux中防止误删文件的做法

Linux系统下防止误删文件的操作

4.数据库中的join

数据库中表的几种JOIN方式

5.从 url 输入到返回请求的过程

从 url 输入到返回请求的过程是怎么样的

3.11

1.C++的右值

可以节省拷贝时间

什么时候用右值引用

2.宏加法

#define ADD(x,y) ((x)+(y)),为什么要括号呢?宏定义表达式写出加法

3.有个小问题,在自定义的结构体,如何使用new

自己记得写构造函数

TreeNode(int x) : val(x), left(NULL), right(NULL) {}

3.24 OceanBase三面

1.把哪几条指令封装成一条机器指令,形成锁

那么怎么解决呢? 能不能让硬件做一种加锁的原子操作呢? 大名鼎鼎的“test and set”指令就是做这个事情的,该指令将读取内存、判断和设置值作为一个原子操作。单核环境下,锁的操作肯定是原子性了,多核呢?貌似还是不行,因为多个核心他们的锁操作是没有干扰的,都能够同时执行“test and set”,还是会出现两个线程同时获取到锁的情况, 所以硬件提供了锁内存总线的机制,在锁内存总线的状态下执行“test and set”操作就可以保证一个只有一个核执行成功,也就保证了不会存在多线程获取到锁的情况。

2.设计单例模式

C++中的单例模式

class CSingleton
{
private:CSingleton()   //构造函数是私有的{}static CSingleton *m_pInstance;
public:static CSingleton * GetInstance(){if(m_pInstance == NULL)  //判断是否第一次调用m_pInstance = new CSingleton();return m_pInstance;}
};
class CSingleton
{
private:CSingleton(){}static CSingleton *m_pInstance;class CGarbo   //它的唯一工作就是在析构函数中删除CSingleton的实例{public:~CGarbo(){if(CSingleton::m_pInstance)delete CSingleton::m_pInstance;}};static CGarbo Garbo;  //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数
public:static CSingleton * GetInstance(){if(m_pInstance == NULL)  //判断是否第一次调用m_pInstance = new CSingleton();return m_pInstance;}
};

使用局部静态变量,非常强大的方法,完全实现了单例的特性,而且代码量更少,也不用担心单例销毁的问题。

class CSingleton
{
private:CSingleton()   //构造函数是私有的{}
public:static CSingleton & GetInstance(){static CSingleton instance;   //局部静态变量return instance;}
};

3.大端小端,英特尔CPU是什么端?

小端,也叫主机字节序。

主机字节序和网络字节序,大端小端

4.设计一个hashmap

C++ STL中哈希表 hash_map从头到尾详细介绍

5.Linux 可执行文件结构与进程结构

Linux 可执行文件结构与进程结构

可以看出,此可执行文件在存储时(没有调入到内存前)分为代码区(text)、数据区(data)和未初始化数据区bss)3 个部分

3.29

基础要牢固

1.页面置换算法

2.进程调度算法和状态

3.单例设计模式

其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。C++中的单例模式

class Single
{
private:Single(){}static Single *sInstance;
public:static Single *getInstance()/*静态变量和静态函数都是分配在内存中的静态区里,第一次分配后函数退出了也不会销毁,在第二次或者n次调用这个函数时直接去静态区中拿来用,不用再分配一次内存,性能能得到不少的提升。*/{if(sInstance==NULL){sInstance=new Single();}return sInstance;}
};

4.最长公共子串

POJ1458 最长公共子序列长度

5.寻找前k小的数

寻找第K大

4.30

1.移动构造函数和移动赋值

使用右值引用传递对象,则代表调用者(有意或无意的)保证不会在之后继续使用该对象。移动构造函数接受右值引用,直接获取老数据。C++笔记 右值引用,移动语义,移动构造函数和移动赋值运算符 - 默然的文章 - 知乎 C++笔记 · 右值引用,移动语义,移动构造函数和移动赋值运算符 - 知乎

class Person {
private:int* data;public:Person() : data(new int[1000000]){}~Person() { delete [] data; }// 拷贝构造函数,需要拷贝动态资源Person(const Person& other) : data(new int[1000000]) {cout<<"hhh"<<endl;std::copy(other.data,other.data+1000000,data);}// 移动构造函数,无需拷贝动态资源Person(Person&& other) : data(other.data) {other.data=nullptr; // 源对象的指针应该置空,以免源对象析构时影响本对象}
};void func(Person p){// do_something
}
int main()
{Person p;func(p);func(Person()); // 调用Person的移动构造函数来创建实参return 0;
}

总结来说,移动构造移动赋值(=操作符)就是把源对象的数据直接移动到新对象上,省去了拷贝操作

class Person
{
private:int age;string name;int* data;public:Person() : data(new int[1000000]){}~Person() { delete [] data; }// 拷贝构造函数Person(const Person& p) :age(p.age),name(p.name),data(new int[1000000]){std::copy(p.data, p.data+1000000, data);cout << "Copy Constructor" << endl;}// 拷贝赋值运算符Person& operator=(const Person& p){this->age = p.age;this->name = p.name;this->data = new int[1000000];std::copy(p.data, p.data+1000000, data);cout << "Copy Assign" << endl;return *this;}// 移动构造函数Person(Person &&p) :age(std::move(p.age)),name(std::move(p.name)),data(p.data){p.data=nullptr; // 源对象的指针应该置空,以免源对象析构时影响本对象cout << "Move Constructor" << endl;}// 移动赋值运算符Person& operator=(Person &&p){this->age = std::move(p.age);this->name = std::move(p.name);this->data = p.data;p.data=nullptr;cout << "Move Assign" << endl;return *this;}
};
int main()
{Person p1;Person p2 = p1; // 拷贝构造函数Person p3,p4;p3 = p4; // 拷贝赋值运算符Person p5;Person p6 = std::move(p5); // 移动构造函数Person p7,p8;p7 = std::move(p8); // 移动赋值运算符return 0;
}

2.Linux命令

Linux 命令大全

awk,功能很强大,主要是分隔字符,linux中的awk命令详解

设置指定分隔符的 要用引号

分割后再插入指定分隔符

awk单行脚本快速参考(三)选择性输出特定行 - 道客巴巴 (doc88.com)

输出指定行内容

输出最后一行以及正则匹配

sed,linux sed命令详解(推荐)_salmonwilliam的博客-CSDN博客

sort,  linux sort 命令详解_salmonwilliam的博客-CSDN博客

top,Linux中top命令参数详解

du,linux命令du - 豆浆D - 博客园 (cnblogs.com)

df,linux命令详解之df命令_蝈蝈的博客-CSDN博客_df命令详解

df命令作用是列出文件系统的整体磁盘空间使用情况。可以用来查看磁盘已被使用多少空间和还剩余多少空间。

查看端口号是否被占用

以3306为例,netstat  -anp  |grep  3306

查看所有端口情况

netstat   -nultp

3.二叉树的非递归遍历

Leetcode 144. Binary Tree Preorder Traversal二叉树前序遍历

Leetcode 94. Binary Tree Inorder Traversal二叉树中序遍历

Leetcode 145. Binary Tree Postorder Traversal二叉树后序遍历

4.LFU的实现

LFU缓存结构设计_salmonwilliam的博客-CSDN博客_lfu实现

设计LRU缓存结构_salmonwilliam的博客-CSDN博客_设计lru缓存结构

5.一致性Hash原理与实现

一致性Hash原理与实现 - 简书 (jianshu.com)

5.11

1.递归反转单链表

/*
struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}
};*/
class Solution {
public:ListNode* ReverseList(ListNode* pHead) {if(pHead==NULL || pHead->next==NULL)return pHead;ListNode *nxt=pHead->next;ListNode *newHead=ReverseList(pHead->next);nxt->next=pHead;pHead->next=NULL;//pHead之前next指向nxt,现在要作废才行return newHead;/*ListNode *pre=NULL,*cur=pHead,*nxt=NULL;while(cur){nxt=cur->next;cur->next=pre;pre=cur;cur=nxt;}return pre;*/}
};

2.n个节点的二叉树有多少种形态

n个节点的二叉树有多少种形态_去远方-CSDN博客

int fun(int x)
{if(x==0 || x==1)return 1;int sum=0;for(int i=0;i<=x-1;i++){sum+=fun(i)*fun(x-1-i);}return sum;
}

5.12

今天收到京东的offer了,4.21是hr面

秋招目标

按照这个要求深入学习,2021年5月12日21:07:40

6.3腾讯

秋招

9.2腾讯光子一面

1.判断链表是够回文结构

判断一个链表是否为回文结构_牛客题霸_牛客网 (nowcoder.com)

/*** struct ListNode {*  int val;*   struct ListNode *next;* };*/class Solution {
public:/*** * @param head ListNode类 the head* @return bool布尔型*/ListNode* reverse(ListNode* head){ListNode* cur=head,*pre=NULL,*nxt=NULL;while(cur){nxt=cur->next;cur->next=pre;pre=cur;cur=nxt;}return pre;}bool isPail(ListNode* head) {// write code hereListNode* fast=head,*slow=head;while(fast && fast->next){slow=slow->next;fast=fast->next->next;}if(fast!=NULL)//链表长度为奇数的时候,比如1->2->3,fast=3,slow=2,slow应该slow=slow->next等于3,从3开始反转后半段链表{slow=slow->next;}ListNode* newhead=reverse(slow);while(newhead){if(newhead->val != head->val){return false;}newhead = newhead->next;head = head->next;}return true;}
};

2.智能指针原理及循环引用解决

智能指针shared_ptr循环引用问题及解决(weak_ptr)_猿来如此~的博客-CSDN博客

shared_ptr造成的循环引用&&解决方法和原理(弱引用&&强引用)_yc2zgh1314的博客-CSDN博客_shared_ptr循环引用

3. Innodb和MyISAM区别

4.重载以及编译器如何处理重载

C++的函数重载_??yy的博客-CSDN博客

最准确的映射机制为:作用域+返回类型+函数名+参数列表

5.SYN泛洪攻击原理及防御

A(攻击者)发送TCP SYN,SYN是TCP三次握手中的第一个数据包,而当这个服务器返回ACK以后,A不再进行确认,那这个连接就处在了一个挂起的状态,也就是半连接的意思,那么服务器收不到再确认的一个消息,还会重复发送ACK给A。这样一来就会更加浪费服务器资源。A就对服务器发送非法大量的这种TCP连接,由于每一个都没法完成握手的机制,所以它就会消耗服务器的内存最后可能导致服务器死机,就无法正常工作了。更进一步说,如果这些半连接的握手请求是恶意程序发出,并且持续不断,那么就会导致服务端较长时间内丧失服务功能——这样就形成了DoS攻击。这种攻击方式就称为SYN泛洪攻击。

那么我们如何去防范这种SYN攻击呢?

其实最常用的一个手段就是优化主机系统设置。比如降低SYN timeout时间,使得主机尽快释放半连接的占用或者采用SYN cookie设置,如果短时间内收到了某个IP的重复SYN请求,我们就认为受到了攻击。我们合理的采用防火墙设置等外部网络也可以进行拦截。

9.6阿里意向书

9.10号美团金融一面

1. MySQL主键与索引的区别和联系

2.介绍实习工作中的推荐系统架构

推荐系统架构介绍

推荐系统全链路(1):召回粗排精排-各有所长

一开始我们可能有成千上万的item,首先要由召回(也叫触发,recall)来挖掘出原则上任何用户有可能感兴趣的东西。这个环节是入口。有时候,单独的召回可能难以做到照顾所有方面,这个时候就需要多路召回。很好懂,就是多个召回路共同决定进入粗排的候选。比如可以由一个召回专门根据用户过往的兴趣来筛选候选,那可以再加一个召回专门输出近一段时间的热门视频。他们的出发点都不一样,共同组成下一级的输入。粗排(pre-rank)一般接受几千个输入,这时候压力就大大降低了。粗排就可以放一些较为复杂的结构,比如mlp就可以放上去了。粗排的输出一般是小于1000的,那这个压力就更小了,精排(rank)就可以变得很复杂,什么transformer啊放进去也不过分。

MySQL分布式实现ID自增

​​​​​​MySQL分布式实现ID自增 (bbsmax.com)

mysql如何实现逻辑自增_mysql 的自增 id 的实现逻辑

9.26华为一面

1.死锁的条件

  1. 互斥,在一个时间,只能有一个进程使用资源
  2. 持有并等待,进程保持至少一个资源正在等待获取其他进程持有的额外资源
  3. 无抢占,一个资源只能被进程自愿释放
  4. 循环等待

2.数据库索引

不能给所有字段都建立索引,维护索引会有很大的成本

3.缓存击穿

  • 加互斥锁。在并发的多个请求中,只有第一个请求线程能拿到锁并执行数据库查询操作,其他的线程拿不到锁就阻塞等着,等到第一个线程将数据写入缓存后,直接走缓存
  • 永不过期,加一个互斥锁保证数据单线程写

redis笔记_salmonwilliam的博客-CSDN博客

4.快排思路

时间复杂度nlogn,最坏情况n^2,空间复杂度考虑到递归的深度,就是logN,最坏就是N

5.指针和引用

指针是对象,引用是别名。

指针存放的是一个对象的地址,可以不赋初值,指针存的值可以改变。引用定义时必须赋值,引用将和它的初始值对象一直绑定在一起。

6.编程题

集合的所有子集_牛客题霸_牛客网 (nowcoder.com)

7.C++内存泄漏的情况

  1. 在类的构造函数和析构函数中没有匹配的调用new和delete函数

  2. 在释放对象数组时在delete中没有使用方括号

  3. 没有将基类的析构函数定义为虚函数。当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露

方法:即使new和delete自己计数,或者用valgrind工具

8.url 输入到返回请求的过程

阿里面试官问“说一下从 url 输入到返回请求的过程”的难度就是不一样! (qq.com)

10.29蚂蚁开奖

11.27蚂蚁三方寄回确认

C++春招实习和秋招面试过程记录相关推荐

  1. 论实习、暑期实习、秋招、春招之间的关系

    自己的亲身体会,由于大三下学期不清楚暑期实习生的大厂招聘时间基本是2-5月份,5月末才反应过来,在此写篇文章给学弟学妹们参考. 所谓"实习"就是未毕业前的去企业上班,此时未签订劳动 ...

  2. 计算机视觉专硕:OCR、实习和秋招

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 智能票据录入系统 项目展示 真的是光阴似箭,好像昨天还沉浸在考研成功的喜悦,今天却要即将步入2 ...

  3. [经验]2020届后台开发方向实习,秋招经验总结

    文章目录 [经验]2020届后台开发方向实习,秋招经验总结 实习 秋招 准备 1.算法题 2.简历 3.基础知识 4.招聘信息 5.智力题 6.心态 7.面经 [经验]2020届后台开发方向实习,秋招 ...

  4. 2021.6~2022.6实习、秋招总结

    2021.6~2022.6实习.秋招总结 总结 实习 秋招 诺瓦星云(西安,FPGA开发) 新华三(成都,西安.数字ic设计) 浙江大华(杭州,FPGA开发) 海康微影传感(杭州,数字ic设计) 商汤 ...

  5. 互联网开发岗实习及秋招总结

    互联网开发岗实习及秋招总结 文章目录 互联网开发岗实习及秋招总结 1 时间就是offer 1.1 实习 1.2 秋招 2 必先利其器 2.1 刷题!刷题!还是tmd刷题! 2.2 多投!多投!还是tm ...

  6. 暑期实习以及实习与秋招浅谈

    实习前一天 从学校请了假到北京来已经过了三天,这三天把百度大厦逛了个遍,明天就要开始正式的实习了,作为双非本科并且是从java转到安卓,现在感觉压力很大,一种不自信,很丧的情绪围绕着心头,收到offe ...

  7. 腾讯2018春招实习生和秋招面试问题

    2018.04.18 首先,我先说说整个过程吧.(如果对过程不感兴趣的话可以直接拉到下面的面试题) 笔试(我觉得考的稀烂,以为没有面试机会的)结束后大概一周,下来了面试通知,下午三点半. 我从我们大学 ...

  8. 关于实习和秋招的准备

    作者:黄小斜 链接:https://www.zhihu.com/question/328924665/answer/800219819 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 之前在知 ...

  9. 潜水党回馈牛友,算法工程师2017年学习,实习,秋招总结

    写在前面: 本人万年潜水党.在牛客网暗中观察了很长时间,也得到了很多有用的信息和帮助.一直计划最后写一篇文章回馈牛客.最近一段时间就是忙完了秋招忙论文.然后就是忙着玩.拖到现在终于赶在2018年到来之 ...

最新文章

  1. 655. Print Binary Tree 解题报告(树)
  2. 批处理中setlocal enabledelayedexpansion
  3. Windows下安装Cygwin配置Hadoop集群
  4. 371. 两整数之和
  5. amd linux 性能,10年内AMD处理器有多大改进?Linux下皓龙和霄龙每瓦性能对决
  6. Java演示手机发送短信验证码功能实现
  7. Spring - Spring Boot Spring Cloud
  8. 使用SpringData出现java.lang.AbstractMethodError
  9. STM32——串口通信
  10. 理论计算机图形渲染技术是否已经到了没有什么可以研究的地步了?
  11. 初中 计算机文化知识,计算机文化知识(Computer literacy).doc
  12. 内存中Android,什么是Android内存转储中的EGL和GL mtrack?
  13. springmvc源码解析MvcNamespaceHandler之mvc:default-servlet-handler/
  14. 『Delphi』File not found的解决办法
  15. python机器学习应用mooc_(1)KNN
  16. 图解设计模式 - Adapter 模式
  17. VNC 远程中标麒麟桌面版
  18. 快手第三季营收231亿:同比增13% 期内亏损27亿
  19. MATLAB 调用cplex解二次规划,【Cplex for MATLAB】安装问题以及二次规划的源码解释问题...
  20. 【ArchSummit】社交元宇宙的技术挑战与探索

热门文章

  1. 【解密】PDF文档忘记编辑密码 照样编辑
  2. Unity与讯飞的aiui交互
  3. 基于灰度投影法的图片偏移测量
  4. dcos master挂掉后 slave上面的container会咋样
  5. FCC算法和数据结构 项目实战:罗马数字转换器
  6. JS计算今天在本月第几周
  7. [win7 百度网盘] 登录安全验证显示空白页
  8. 市场调研-全球与中国LED多层指示灯市场现状及未来发展趋势
  9. ajax请求遇到的一些乱码问题及其解决
  10. yudian温控表a1温度怎么补偿_厦门宇电yudian温控表AI-516/516P型人工智能温度调节器控制器-恩莱自动化官网...