基于Intel® AI Analytics Toolkits的智能视频监控系统
【oneAPI DevSummit & OpenVINODevCon联合黑客松】
跳转链接:https://marketing.csdn.net/p/d2322260c8d99ae24795f727e70e4d3d
目录
1方案背景
2方案描述
3需求分析
4技术可行性分析
5详细设计5.1数据采集
5.2视频解码与帧提取
5.3人脸检测
5.4行为识别
5.5数据分析
5.6结果展示
6方案优点与适用场景
6.1解决的问题
6.2适用场景
7总结
方案中用到的工具及组件
1方案背景
当代社会对于视频监控的需求体现在各行各业,但传统的视频监控的弊端也逐渐显露。
主要有以下几个方面。首先,人工监控效率比较低,传统视频监控系统依赖人工操作和观察,监控人员需要连续观看监控画面,容易疲劳和错过重要的事件或行为,导致监控效率低下;其次,实时性差,传统视频监控系统中的录像需要人工进行回放和分析,无法实时监测和及时响应突发事件,对于紧急情况的处理存在一定的滞后性;数据处理和管理方面也比较困难,传统视频监控系统中产生的大量视频数据需要存储和管理,通常使用硬盘,存在容量有限、数据丢失风险高等问题,同时查找和检索特定事件的视频也相对困难;最后,还有明显的劣势就是由于传统视频监控系统主要依赖人工判断和操作,存在误报和漏报的情况。监控人员可能因为疲劳、视觉限制或判断错误。
正因为传统视频监控在监控效率、实时性、数据处理和管理以及误报漏报等方面存在一些劣势问题。为了克服这些问题,智能视频监控系统应运而生.
通过结合人工智能和图像识别等先进技术,智能视频监控系统能够高效的实时监测和响应能力、智能化的数据处理和管理等优势,满足当下社会对于安全和管理的需求,并且还能进行自动分析和处理大量的监控数据,并及时发出警报等等更加便捷的功能,相比传统监控需要人工观察和分析,智能系统也能够更快速、准确地识别异常行为。
2方案描述
本方案利用英特尔® oneAPI AI分析工具套件中的产品组件和库,结合深度学习和视频分析技术,构建一个智能视频监控系统,用于实时监测和分析人员活动,提供监测,识别,报警等功能,还可用于大数据分析,远程访问和管理等方面。
3需求分析
功能需求:系统需要实时采集视频流并进行预处理,包括去噪和降低分辨率。同时,系统需要能够解码视频并提取关键帧用于人脸检测和行为识别。最后,系统需要展示分析结果,包括标注人脸和行为,并能够实时报警。
性能需求:系统需要在实时场景下对大量视频数据进行处理和分析,因此需要具备高效的算法和硬件支持,并保证处理速度和响应时间符合要求。
可靠性需求:系统需要具备稳定可靠的运行能力,包括对异常情况的处理能力,如断电恢复和网络故障处理。
安全需求:系统需要确保视频数据的安全性和隐私保护,防止未经授权的访问和篡改。
用户体验需求:系统需要具备良好的用户界面和操作体验,保证用户能够方便地使用和理解系统的功能和结果展示。
4技术可行性分析
1.数据采集和预处理:使用摄像头设备进行实时视频流采集,并利用图像处理库(如OpenCV)对视频流进行预处理。这些技术已经成熟,具备较高的可行性。
2.视频解码与帧提取:使用英特尔® oneAPI加速工具对视频进行解码,并提取关键帧用于后续的人脸检测和行为识别。这些技术在英特尔® Distribution of OpenVINO™ Toolkit中得到支持,具备较高的可行性。
3.人脸检测:使用英特尔® OpenVINO™ Toolkit中的人脸检测模型,对每个关键帧进行实时检测人脸。该工具包含了经过训练和优化的模型,具备较高的可行性。
4.行为识别:结合英特尔® Distribution of OpenVINO™ Toolkit中的行为识别模型,对监控区域内的人员活动进行分析。使用深度学习框架加载和运行行为识别模型,根据视频流的关键帧进行行为识别。这些技术已经成熟,具备较高的可行性。
5.结果展示:利用图像处理库(如OpenCV)将人脸检测和行为识别的结果标注在原始视频帧上,并将结果实时显示或保存为报警。
5详细设计
5.1数据采集
使用摄像头设备进行实时视频流采集。
使用适当的图像处理库(如OpenCV)对视频流进行预处理,例如去噪、降低分辨率等。
去噪处理:在实时视频流采集过程中,可能会受到各种干扰,例如摄像头本身的噪声、光线变化等,因此需要进行去噪处理来提高图像质量。
使用OpenCV库进行高斯模糊去噪
# 读取原始帧frame = cv2.imread("original_frame.jpg")# 高斯模糊去噪denoised_frame = cv2.GaussianBlur(frame, (5, 5), 0)# 显示去噪后的结果cv2.imshow("Denoised Frame", denoised_frame)cv2.waitKey(0)cv2.destroyAllWindows()降低分辨率处理: 对视频流进行降低分辨率处理可以减少数据量和计算复杂度,同时可以加快后续的人脸检测和行为识别的处理速度。使用OpenCV库进行图像缩放# 读取原始帧frame = cv2.imread("original_frame.jpg")# 缩小分辨率scaled_frame = cv2.resize(frame, (0, 0), fx=0.5, fy=0.5)# 显示降低分辨率后的结果cv2.imshow("Scaled Frame", scaled_frame)cv2.waitKey(0)cv2.destroyAllWindows()
通过以上的去噪和降低分辨率处理,可以使得后续的视频解码、人脸检测和行为识别等步骤更加高效和准确。
5.2视频解码与帧提取
视频解码与帧提取是智能视频监控系统中非常重要的一步,它涉及到从视频数据中提取出关键帧,为后续的人脸检测和行为识别提供数据支持。
视频解码:视频解码是将视频文件中的压缩数据解码成原始的视频帧数据的过程,以便后续的处理和分析。在这个步骤中,可以使用英特尔® oneAPI加速工具中提供的相应库和工具来进行视频解码,我们使用Media SDK进行硬件加速的视频解码。
帧提取:一般情况下,并不需要对视频的每一帧都进行人脸检测和行为识别,因为视频数据通常包含了大量的冗余信息。因此在帧提取的过程中,我们可以选择提取视频中的关键帧,然后对这些关键帧进行后续的处理和分析。
我们打开一个视频文件,使用OpenCV库进行视频解码和帧提取。通过设定提取间隔,我们可以控制关键帧的提取频率。当达到提取间隔时,我们将当前帧保存为关键帧图像文件,以便后续的人脸检测和行为识别。
# 打开视频文件video_capture = cv2.VideoCapture('input_video.mp4')# 视频帧计数器frame_count = 0# 提取间隔,例如每隔5帧提取一次extract_interval = 5# 逐帧读取视频while video_capture.isOpened():# 读取一帧ret, frame = video_capture.read()if not ret:break# 如果达到提取间隔,保存当前帧为关键帧if frame_count % extract_interval == 0:key_frame_name = 'keyframe_{}.jpg'.format(frame_count)cv2.imwrite(key_frame_name, frame)print('Saved key frame: {}'.format(key_frame_name))frame_count += 1video_capture.release()cv2.destroyAllWindows()
这样,视频解码与帧提取步骤就完成了,我们得到了一系列关键帧图像,可以用于接下来的人脸检测和行为识别。
5.3人脸检测
使用英特尔® OpenVINO™ Toolkit中的人脸检测模型,在每个关键帧中实时检测人脸。
使用以下代码示例进行人脸检测:
import cv2 from openvino.inference_engine import IECore# 加载模型ie = IECore()Net=ie.read_network(model='face_detection.xml',weights='face_detection.bin')exec_net = ie.load_network(network=net, device_name='CPU')# 读取关键帧frame = cv2.imread("keyframe.jpg")# 预处理input_blob = cv2.dnn.blobFromImage(frame, size=(300, 300), ddepth=cv2.CV_8U)# 推理result = exec_net.infer(inputs={'input_blob_name': input_blob})# 解析结果for detection in result['detection_out']:confidence = detection[2]if confidence > 0.5:x_min, y_min, x_max, y_max = detection[3:7]cv2.rectangle(frame, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)# 显示结果cv2.imshow("Face Detection", frame)cv2.waitKey(0)cv2.destroyAllWindows()
5.4行为识别
首先加载已经训练好的行为识别模型(通过TensorFlow进行训练得到的)。然后对关键帧进行预处理,将其输入到模型中进行推理,得到行为的预测结果。最后,将预测的行为结果标注在图像上,并显示或保存带有标注的图像,以便展示给监控人员或用于进一步的处理和分析。
以下是一个用TensorFlow进行行为识别的简单代码:import tensorflow as tfimport cv2# 加载行为识别模型model = tf.keras.models.load_model('behavior_model.h5')# 读取关键帧frame = cv2.imread("keyframe.jpg")# 对关键帧进行预处理processed_frame = preprocess_image(frame) # 进行图像预处理,例如调整大小、归一化等操作# 使用模型进行推理predictions = model.predict(processed_frame)# 获取最终的行为识别结果predicted_behavior = get_predicted_behavior(predictions) # 根据模型输出获取最终的行为识别结果# 在图像上标注行为识别结果cv2.putText(frame,predicted_behavior,(50,50),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 显示带有行为识别结果标注的图像cv2.imshow("Behavior Recognition", frame)cv2.waitKey(0)cv2.destroyAllWindows()
5.5数据分析
利用英特尔® DevCloud和英特尔® oneAPI的分布式计算能力,对大规模视频数据进行并行处理和分析。
使用分布式计算框架(如Apache Spark)将数据分片并在多个处理器上并行处理,以提高处理速度和效率。
在数据分析步骤中,针对大规模视频数据进行并行处理和分析是非常关键的,我们通过英特尔® DevCloud和英特尔® oneAPI的分布式计算能力来实现。利用分布式计算框架(选用Apache Spark)对视频数据进行并行处理和分析:
我们利用SparkSession创建一个Spark应用程序,通过Spark读取大规模视频数据。接着使用zipWithIndex和map等操作对视频数据进行分片,并利用mapPartitions将处理任务并行化。最后通过reduce将各个分片的结果汇总,并展示或保存最终的分析结果。需要根据不同的业务场景和数据的特点来编写process_video_data、merge_results和show_or_save_results等函数来实现实际的数据分析逻辑和结果展示操作。
from pyspark.sql import SparkSession# 创建SparkSessionspark = SparkSession.builder.appName("VideoDataAnalysis").getOrCreate()# 读取大规模视频数据video_data = spark.read.format("video").load("hdfs://path_to_video_data")# 对视频数据进行分片video_data_rdd = video_data.rdd.zipWithIndex().map(lambda x: (x[1] % num_partitions, x[0]))# 在多个处理器上并行处理result_rdd = video_data_rdd.mapPartitions(process_video_data)# 将分析结果汇总final_result = result_rdd.reduce(merge_results)# 展示或保存分析结果show_or_save_results(final_result)# 停止SparkSessionspark.stop()
5.6结果展示
使用图像处理库(如OpenCV)将人脸检测和行为识别的结果标注在原始视频帧上,并将结果实时显示或保存为报警记录。
实时结果展示:可以通过实时视频流展示人脸检测和行为识别的结果,例如在监控中心的监视屏幕上实时显示标记了人脸框和行为类别的视频画面。这可以帮助监控人员及时发现异常情况并采取相应的措施。
使用OpenCV库展示实时的人脸检测结果
import cv2from openvino.inference_engine import IECore# 加载模型ie = IECore()net = ie.read_network(model='face_detection.xml', weights='face_detection.bin')exec_net = ie.load_network(network=net, device_name='CPU')# 读取视频流video_capture = cv2.VideoCapture(0)while True:# 逐帧读取视频ret, frame = video_capture.read()if not ret:break# 预处理input_blob=cv2.dnn.blobFromImage(frame,size=(300,300), ddepth=cv2.CV_8U)# 推理result = exec_net.infer(inputs={'input_blob_name': input_blob})# 解析结果for detection in result['detection_out']:confidence = detection[2]if confidence > 0.5:x_min, y_min, x_max, y_max = detection[3:7]cv2.rectangle(frame, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)# 显示结果cv2.imshow("Real-time Face Detection", frame)# 按下 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):breakvideo_capture.release()cv2.destroyAllWindows()我们实时从摄像头中获取视频流,并在每一帧上进行人脸检测并实时展示结果。报警记录保存:当发现异常情况时,还将标记了人脸检测和行为识别结果的关键帧保存为报警记录,以便后续的查看和分析。通过将结果帧保存为图片文件来实现。保存标记了人脸检测结果的关键帧import cv2# 读取关键帧frame = cv2.imread("keyframe.jpg")# 在关键帧上标记人脸检测结果# ...# 保存标记后的关键帧为报警记录图片文件cv2.imwrite("alarm_record.jpg",frame)print('Saved alarm record: alarm_record.jpg')
通过以上方式,我们实现了对人脸检测和行为识别结果的实时展示以及异常情况的报警记录保存。这样就能够有效地提高监控系统的智能化水平和工作效率。
以上就是本方案大致的实现流程。
6方案优点与适用场景
6.1解决的问题
1.安全保障:可以实时监测监控区域内的活动,识别异常行为(如盗窃、打架等),并及时发出警报,从而提高安全性,减少犯罪事件发生的可能性。
2.事故预防:通过对监控区域内的活动进行实时分析,系统可以识别潜在的安全风险和危险行为,并及时采取预防措施,减少意外事故的发生。
3.人员管理:系统可以帮助管理人员监视和跟踪工作人员和顾客的活动,协助管理人员更好地分配资源和规划工作流程。
4.数据分析:系统可以收集大量视频数据,并利用数据分析技术来提取有用的信息,如顾客流量统计、行为趋势分析等,为经营决策提供参考依据。
5.远程监控:用户可以通过网络远程访问监控画面,实现对监控区域的远程监控和管理,提高管理效率和便利性。
6.2适用场景
1.商店和超市:用于防盗和管理人员监督。
2.公共交通枢纽:用于监控车站和机场等公共场所,确保乘客的安全和秩序。
3.工厂和仓库:用于监控生产线和存储区域,提高安全性和生产效率。
4.学校和校园:用于学生安全和管理,监测校园活动。
5.智能交通管理:利用视频监控系统进行交通流量监测和违章行为检测,提高道路交通管理效率。
6.环境监测:结合图像识别和监测技术,用于环境监测、自然灾害预警等领域。
7.医疗保健:用于监控医院和养老院内的患者和老人,确保其安全和健康。
7总结
未来,随着深度学习技术和硬件加速器的不断发展,智能监控系统将实现更高精度和更快速的处理能力,为安防领域带来更多可能性。基于Intel® AI Analytics Toolkits的智能视频监控系统将有望在智能监控领域取得显著进展。但是,实现这一方案也面临一些挑战,包括模型训练的数据标注、算力需求较大、实时性要求等,需要综合考虑硬件、软件和数据等方面的因素,以实现系统的稳定运行和高效处理。
方案中用到的工具及组件
1.英特尔® Distribution of OpenVINO™ Toolkit
2.英特尔® DevCloud
3.英特尔® oneAPI 加速工具
相关文章:
基于Intel® AI Analytics Toolkits的智能视频监控系统
【oneAPI DevSummit & OpenVINODevCon联合黑客松】 跳转链接:https://marketing.csdn.net/p/d2322260c8d99ae24795f727e70e4d3d 目录 1方案背景 2方案描述 3需求分析 4技术可行性分析 5详细设计5.1数据采集 5.2视频解码与帧提取 5.3人脸检测 5.4行为识别…...

深度学习中的注意力机制:原理、应用与实践
深度学习中的注意力机制:原理、应用与实践 摘要: 本文将深入探讨深度学习中的注意力机制,包括其原理、应用领域和实践方法。我们将通过详细的解析和代码示例,帮助读者更好地理解和应用注意力机制,从而提升深度学习模…...

将本地项目推送到github
欢迎大家到我的博客浏览。将本地项目推送到github | YinKais Blog 本地项目上传至 GitHub<!--more--> 1、进入项目根目录,初始化本地仓库 git init 2、创建密钥:创建 .ssh 文件夹,并进入 .ssh 文件夹 mkdir .ssh cd .ssh/ 3、生成…...

[读论文]meshGPT
概述 任务:无条件生成mesh (无颜色)数据集:shapenet v2方法:先trian一个auto encoder,用来获得code book;然后trian一个自回归的transformermesh表达:face序列。face按规定的顺序&a…...

反序列化漏洞详解(一)
目录 一、php面向对象 二、类 2.1 类的定义 2.2 类的修饰符介绍 三、序列化 3.1 序列化的作用 3.2 序列化之后的表达方式/格式 ① 简单序列化 ② 数组序列化 ③ 对象序列化 ④ 私有修饰符序列化 ⑤ 保护修饰符序列化 ⑥ 成员属性调用对象 序列化 四、反序列化 …...

键盘打字盲打练习系列之指法练习——2
一.欢迎来到我的酒馆 盲打,指法练习! 目录 一.欢迎来到我的酒馆二.开始练习 二.开始练习 前面一个章节简单地介绍了基准键位、字母键位和数字符号键位指法,在这个章节详细介绍指法。有了前面的章节的基础练习,相信大家对盲打也有了…...

小程序----使用图表显示数据--canvas
需求:在小程序上实现数据可视化 思路:本来想用的是echarts或者相关的可视化插件,但因为用的是vue3,大多数插件不支持,所以用了echarts,但最后打包的时候说包太大超过2M无法上传,百度了一下&…...

⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
1.这里我代码没啥问题~~~编辑器里也没毛病 void Start(){// 加载底图和上层图片string backgroundImagePath Application.streamingAssetsPath "/background.jpg";Texture2D backgroundTexture new Texture2D(2, 2);byte[] backgroundImageData System.IO.File.R…...

document
原贴连接 1.在整个文档范围内查询元素节点 功能API返回值根据id值查询document.getElementById(“id值”)一个具体的元素节根据标签名查询document.getElementsByTagName(“标签名”)元素节点数组根据name属性值查询document.getElementsByName(“name值”)元素节点数组根据类…...

NodeJS(二):npm包管理工具、yarn、npx、pnpm工具等
目录 (一)npm包管理工具 1.了解npm 2.npm的配置文件 常见的配置属性 scripts属性*** 依赖的版本管理 3.npm安装包的细节 4.package-lock文件 5.npm install原理** 6.npm的其他命令 (二) 其他包管理工具 1.yarn工具 基本指令 2.cnpm工具 3.npx工具 (1)执行本地…...
day3 移出链表中值为x的节点
ListNode* removeElements(ListNode* head, int val) { ListNode* dummyHead new ListNode(0); // 设置一个虚拟头结点 dummyHead->next head; // 将虚拟头结点指向head,这样方便后面做删除操作 ListNode* cur dummyHead; while (cur->next ! NULL…...

浅谈 Guava 中的 ImmutableMap.of 方法的坑
作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐&…...

Symbol()和迭代器生成器
目录 1、Symbol() 2、迭代器生成器 执行流程 模拟生成器函数 for of 遍历迭代选择器 yield * Generator函数应用 1、Symbol() Symbol表示独一无二的值 const s1 Symbol(a)const s2 Symbol(a)console.log(s1 s2) // fa…...
USB Type-C的基本原理
1 USB Type-C的基本原理 1.1 基本特性 Figure 1-1 USB Type-C接头外形 USB Type-C(简称USB-C)的基本特性: 1. 接口插座的尺寸与原来的Micro-USB规格一样小,约为8.3mm X 2.5mm 2. 可承受1万次反复插拔 3. 支持正反均可插入的“正反…...
HarmonyOS开发(八):动画及网络
1、动画概述 在ArkUI中,产生动画的方式是改变组件属性值并且指定相关的动画参数。当属性值发生变化后,按照动画参数,从原来的状态过渡到新的状态,就形成一个动画。 动画的相关参数如下: 属性名称 属性类型 默认值 …...

Pinctrl子系统和GPIO子系统
Pinctrl子系统: 借助Princtr子系统来设置一个Pin的复用和电气属性; pinctrl子系统主要做的工作是:1. 获取设备树中的PIN信息;2.根据获取到的pin信息来设置的Pin的复用功能;3.根据获取到的pin信息去设置pin的电气特性…...

Unittest单元测试框架之unittest构建测试套件
构建测试套件 在实际项目中,随着项目进度的开展,测试类会越来越多,可是直到现在我 们还只会一个一个的单独运行测试类,这在实际项目实践中肯定是不可行的,在 unittest中可以通过测试套件来解决该问题。 测试套件&…...
Django回顾4
一.过滤器 1.过滤器格式 {{变量|过滤器名字}} 2.怎么使用 1.注册app 2.在app下创建templatetags模块(模块名只能是templatetags) 3.在包下写一个py文件,随便命名 4.在py文件中写入:from django import template …...
Apache APISIX 体验指南
APISIX 体验指南 所有的 sh 脚本通过 git bash 执行。 出现错误仔细核对文档。 github 地址: 使用 docker 安装 apisix 确保本地安装 Docker 和 Docker-compose 如未安装参开以下文档安装: Docker:https://docs.docker.com/engine/install/c…...

Promise的resolve和reject方法(手写题)
1.resolve 2.reject 3.手写 1.resolve //构造函数上添加 resolve 方法 Promise.resolve function (value) {return new Promise((resolve, reject) > {if (value instanceof Promise) {value.then((val) > {resolve(val)},(err) > {reject(err)})} else {resolve(v…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...