C语言K&R圣经笔记 6.3结构体数组

6.3 结构体数组 考虑写个程序来计算每个 C 语言关键字的出现次数。我们需要一个字符串数组来保存关键字名称,还需要一个整数数组来保存数量。一种可能的方式是使用两个并行的数组,keyword 和 keycount : char *keyword[NKEYS]; int keycount[NKEYS]; 但两个数组是并行的这个事实,暗示了还有一种不同的组织方式,即结构体数组。每个关键字条目是一对: char *word; int count; 且有一个数组由这样的对组成。如下结构声明 struct key { char *word; int count; } keytab[NKEYS]; 声明了一个结构体类型 key,定义了这种类型的一个数组 keytab,并为它们分配了空间。数组的每个元素都是一个结构体。也可以写成: struct key { char *word; int count; }; struct key keytab[NKEYS]; 由于 keytab 这个结构包含了名称的常量集合,最简单的办法是让它成为一个外部变量,并在定义时将它一劳永逸地初始化。结构体的初始化与之前的类似——在定义后面加上由大括号括起来的初始化列表: struct key { char *word; int count; } keytab[] = { "auto", 0, "break", 0, "case", 0, "char", 0 "const", 0, "continue", 0, "default", 0, /* .

el-table 自定义表头

<el-table-column width="100" :render-header="addTable" align="center" label="操作" v-if="disabled"> <template slot-scope="scope"> <el-button @click="del(scope.row)" size="small" type="danger">删除</el-button> </template> </el-table-column> // 新增表单的新增按钮 addTable() { return ( <div> <el-button size="mini" type="primary" onClick={() => this.addItem()}> 导入 </el-button> </div> ); },

如何修改已安装Qt开发工具的开发组件

很多大佬,由于在安装Qt的时候,只是把当前会用到的开发组件勾选进行了安装。但是随着大佬们的不断学习,就又需要使用Qt进行别的内容的开发(比如利用Qt进行安卓开发),这时候就会发现当时在安装的时候并没有勾选那个开发组件,就导致不知道怎么去修改这个Qt安装的开发组件。 本篇文章就介绍了如何修改已安装Qt的开发组件,以及在使用时出现的问题的解决方法 要去修改Qt的开发组件,第一次安装Qt的时候就有用来修改已安装QT开发组件的工具,就在Qt的安装文件夹下,有个叫MaintenanceTool的可执行程序,这个就是用来修改已安装Qt的开发组件和下载其它版本Qt软件所用的 双击运行这个程序就能修改Qt的开发组件,但是在使用时需要你有一个Qt的账号来登录,没有在程序里面注册一个就可以 在配置之前,首先先解决在使用这个程序时可能会遇到的问题,如果没有遇到下面的问题则直接可以跳过该部分 问题1:在Setup页面点击"Add or remove components"或"Update components"选项时出现"At lwast one valid and enabled repository required for this action to succeed"的错误信息 问题2:显示缺少或丢失"qt.563.qtserialbus"依赖项的问题 解决运行MaintenanceTool.exe出现的问题 问题一 具体问题显示信息如图所示: 问题分析 这个问题是没有存储库导致的,在老版本的Qt维护工具中,是不提供存储库的,所以这里需要自己配置一下 解决方法 首先点击设置 点击资料档案库 在老版本的资料档案库中里面是没有东西的 选择临时资料档案库点击添加 这时就需要去https://download.qt.io/static/mirrorlist/这里去找一个国内的镜像,然后把http地址复制到临时资料档案库里面 注意选择镜像时,要选择China。这里以选择清华大学Qt镜像为例,来实际操作一下 在这里依次点击online/qtsdkrepository/windows_x86/root/qt/目录 这时把上面的http地址复制到Qt维护工具里面,点击确定 这时再去点击"Next"就不会报错了 问题二 具体问题显示信息如图所示: 问题分析 这个问题是由于工具版本太老导致的,需要更新 解决方法 解决这个问题也比较简单,选择"Update components"点击Next当进度条达到100%时再次点击Next进行工具的更新就可以了 出现这样的提示点击OK就可以 当更新完成后,就可以点击finish,之后稍等片刻双击MaintenanceTool可执行文件,可以看到这个Qt维护工具的界面都变了 现在这两个问题就都解决了,就可以利用Qt维护工具去修改已安装Qt的开发组件了 利用MaintenanceTool.exe修改已安装Qt的开发组件 选择添加或移除组件点击下一步 稍等片刻进入下面的页面,勾选所有选项点击筛选 稍等片刻后就会出现当前所有版本的Qt,这时找到你所安装的Qt版本然后展开就可以进行配置了 到这里,如何修改已安装Qt软件的开发组件以及其中遇到问题的解决方法就介绍到这里了 感谢观看学习,大佬们多多指点,愿明天的自己会感谢当下的努力!!!!

C. Theofanis‘ Nightmare

Theofanis 在入睡前很容易沉迷于各种问题,经常做噩梦。为了解决这个问题,他去看了他的医生 Emix 博士。 在他最近的噩梦中,他有一个大小为 n 的数组 a ,想把它分成非空的子数组,使得每个元素都正好在其中一个子数组中。 例如,数组 [1,−3,7,−6,2,5] 可以划分为 [1][−3,7][−6,2][5] 。 这种分割的塞浦路斯值等于 i⋅sumi,其中 k 是我们将数组分割成的子数组的个数,sumi 是第 i 个子数组的和。 这个数组的塞浦路斯值为 [1][−3,7][−6,2][5]=1⋅1+2⋅(−3+7)+3⋅(−6+2)+4⋅5=17 。 Theofanis 想知道任何数组划分的最大塞浦路斯值是多少。 数组 b 是数组 a 的子数组,如果 b 可以从 a 中通过删除开头的几个(可能是零个或全部)元素和结尾的几个(可能是零个或全部)元素得到。特别地,一个数组是它自身的一个子数组。 输入 第一行包含一个整数 t ( 1 ≤ t ≤ 1e4 ) - 测试用例的数量。 每个测试用例由两行组成。每个测试用例的第一行包含一个整数 n (1 ≤ n ≤ 1e5) - 数组的大小。 第二行包含 n 个整数 a1,a2,…,an (−1e8 ≤ ai ≤ 1e8) - 数组的元素。 保证所有测试用例的 n 之和不超过 2e5 。

《幻兽帕鲁》1月29日游戏服务器推荐!腾讯云降低规格再次降价!

腾讯29日刷新规格,从14M降低到12M,硬盘和流量都有降低,但价格打下来了!价格从66元/月降低到32元/月,277元/3个月降低到96元/3个月! 三大厂商4核16G的云服务器价格对齐,不过具体参数略有不同 阿里云优势:不限流量,全天游玩不怕流量超出 》》游戏联机服务器32元/月 腾讯云优势:存储空间大,带宽高网速佳 》》幻兽帕鲁服务器66元/月 4-8个玩家游玩 规格硬盘流量时长价格备注腾讯4核16G12M120GB2048GB流量1个月32推荐120GB2048GB流量3个月96推荐阿里4核16G3M100GB不限流量1个月32推荐100GB不限流量3个月96推荐华为4核16G3M40GB不限流量1个月32 40GB不限流量3个月96 10-16个玩家游玩 规格硬盘流量时长价格备注腾讯8核32G22M320GB4500G流量1个月115 320GB4500G流量3个月345推荐阿里8核32G10M100GB不限流量1个月90推荐100GB不限流量3个月271推荐华为8核32G5M40GB不限流量1个月113 40GB不限流量3个月338 阿里云腾讯云不分伯仲,腾讯云有带宽硬盘优势,阿里云有不限流量优势 如果每月游玩时间不长,推荐腾讯云;基本全天在线的话可选阿里云

积极响应政府号召,左江科技为大学助学活动奉献爱心

一家优秀企业,一定不只有精良产品和出众的销量,更应该勇于承担起社会责任,为建设美好国家而共同努力。左江科技便是这样一家积极践行社会责任、参与各项公益事业活动的优秀企业。 2023年4月,左江科技响应湖南省花垣县十八洞乡村发展基金会发起的“助学圆梦 砥砺前行”公益项目号召,为14名贫困学生提供助学资金,并帮助他们顺利考入理想大学,为14名少年赢得了一个全新的人生和未来,也为国家增添了14名优秀人才。 大学生是我们未来社会建设中的重要栋梁,也是贫困学生冲破人生桎梏、重启人生机遇的新起点。对此,左江科技负责人表示,希望他们能够在今后的学习生活中努力拼搏、奋勇前进,用优异的成绩、过硬的本领来反哺家乡、回报社会。 这些年来,左江科技始终将“责任”二字牢牢记在心间,不仅在疫情初期高价购入口罩支援一线抗疫人员,为他们筑起一道生命的安全防线,也在京津冀特大暴雨时期捐款捐物,为抗震救灾献出一份力量。此外,左江科技还多次组织公益活动为罕见病发声 ,让更多爱心人士能够了解、帮助罕见病人群,点亮更多生命之光。 有爱心、有技术的左江科技无疑是其它企业学习、效仿的优秀对象,有更多这样的良心企业,国家发展才会越来越好,百姓生活才会越来越幸福!

将elasticsearch数据存储到excel中

由于elasticsearch数据在线上,偶尔需要将数据导到本地环境进行分析。目前有需求是将数据导入到excel表中,下面是我在用的实现方案。 1、将线上elasticsearch数据备份成文件 首先通过elasticdump组件将线上指定的index导出成文本文件 elasticdump --input="http://192.168.0.30:9200/adv_default" --output="/bigdata/adv_default.data" --type=data --limit=10000 数据样例: 2、将生成的文本文件下载到指定位置存储,以我本地电脑为例 3、通过python脚本将数据写入到excel import json import pandas as pd # 读取JSON文件 json_file_path = 'D:/data/adv_default.data' with open(json_file_path, 'r', encoding='utf-8') as file: json_data = file.readlines() # 解析JSON数据 data_list = [] for line in json_data: json_line = json.loads(line) source_data = json_line['_source'] data_list.append(source_data) # 转换为DataFrame df = pd.DataFrame(data_list) # 指定 输出的 Excel 文件路径 excel_output_file = json_file_path.split('.')[0] + '.xlsx' # 将数据写入Excel文件 df.to_excel(excel_output_file, index=False) 生成的文件格式如下:

K8s 安装部署-Master和Minion(Node)

K8s 安装部署-Master和Minion(Node) 操作系统版本:CentOS 7.4 Master :172.20.26.167 Minion-1:172.20.26.198 Minion-2:172.20.26.210(后增加节点) ETCD:172.20.27.218 先安装部署ETCD yum install etcd -y cd /etc/etcd/ cp etcd.conf etcd.conf.bak #备份etcd.conf 文件 grep -aivE "#|^$" etcd.conf #去掉#、空行的显示 [root@localhost etcd]# grep -aivE "#|^$" etcd.conf ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_CLIENT_URLS="http://localhost:2379" ETCD_NAME="default" ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379" vim etcd.conf [root@localhost etcd]# mkdir -p /data/etcd/ #创建ETCD的数据目录 [root@localhost etcd]# id etcd #看看ETCD用户 uid=997(etcd) gid=995(etcd) 组=995(etcd) [root@localhost etcd]# chown -R etcd.etcd /data/etcd/ #对数据目录授权etcd用户和组 [root@localhost etcd]# ls -ld /data/etcd/ #查看数据目录权限 drwxr-xr-x. 2 etcd etcd 6 4月 17 13:32 /data/etcd/

4K三路虚拟情景互动教学软件教学

4K三路虚拟情景互动教学软件具备了丰富多元化的功能,如情景实训,微课录制,人物滤镜调节,截图编辑,视频编辑,场景自定义编辑,3D设置,视频录制,视频编辑,视频直播,字幕,图片,特效输入,画中画插入,AI对话,模型选择等功能。 4K三路虚拟情景互动教学软件在课堂学习过程中的作用着重在于情景实训与课件录制两方面。 在情景体验教学方面,根据实际专业教学课程内容,通过计算机模拟制作课程内容场景,教师在教学过程中选择符合课程实际的场景进行教学,系统为学生模拟创建真实的场景,学生在虚拟场景下进行学习交流。通过情景训练+课堂授课,学生能够快速巩固专业知识的同时能够更好地提升技能水平,扩充实践机会,实现理论与实践相步;新增的AI对话功能能够帮助语言类专业的学生进行口语能力训练,更好地适应复杂多变的语言环境。 在课件录制方面,通过高清摄像机来实时捕捉教师活动图像,计算机模拟的微课场景与教师活动图像进行抠像合成,使得人+场景完美融合到一起,整个画面真实自然。在录制过程中,教师将课件资源,如图片,PPT,文档等以画中画的方式呈现在画面中进行教学辅导,课件录制结束后,教师可以对视频进行编辑与修改,呈现优质的教学视频作为日后为学生学习的教学资源。

vite+ts+vue3打包的过程和错误

文章目录 概要vite.config.ts配置tsconfig.json 的配置package.json 的配置路由配置打包打开打包后的文件小结 概要 完成vite的打包,和在本地打开页面 记录一下,vite打包过程中的问题!!! vite.config.ts配置 vite.config.ts配置打包的相关配置 import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], base: './', //打包后的引入css文件时前加./ build: { //打包文件名称 outDir: 'vitescreen', assetsDir: 'assets', sourcemap: false, terserOptions: { compress: { drop_console: true, drop_debugger: true, }, }, }, //....省略其他内容 }) tsconfig.json 的配置 直接复制既可,要是原本有相应的配置,可自己查重 { "compilerOptions": { "useDefineForClassFields": true, "strict": true, "jsx": "preserve", "

Django模型(三)

一、1对1关系映射 关系型数据库的强大之处在于各表之间的关联关系。 Django 提供了定义三种最常见的数据库关联关系的方法:多对一,多对多,一对一 一对一关联使用 OneToOneField来定义一对一关系 就像使用其他类型的 Field 一样:在任意一边模型属性中包含它 from django.db import models class Place(models.Model): name = models.CharField(max_length=50) address = models.CharField(max_length=80) def __str__(self): return "%s the place" % self.name class Restaurant(models.Model): place = models.OneToOneField( Place, on_delete=models.CASCADE, primary_key=True, ) # BooleanField 在数据库使用 tinyint 类型 serves_hot = models.BooleanField(default=False) serves_clod= models.BooleanField(default=False) def __str__(self): return "%s the restaurant" % self.place.name 二、1对多关系映射 定义一个多对一的关联关系,使用 django.db.models.ForeignKey 类。就和其它 Field字段类型一样,只需要在你模型中添加一个值为该类的属性 ForeignKey类需要多的一方添加一个参数,即你想要关联的模型类名 from django.db import models class Place(models.Model): name = models.

如何解决使用若依前后端分离打包部署到服务器上后主包无法找到从包中的文件的问题?如何在 Java 代码中访问 jar 包中的资源文件?

目录 一、说明二、在 Java 代码中访问 jar 包中的资源文件方法1 使用 ClassLoader 类来加载资源并返回其 URL方法2 使用 ResourceUtils.getURL() 方法来获取资源文件的 URL方法3 使用 ClassLoader.getResourceAsStream()方法来加载资源文件。方法4 提取到系统临时文件夹中 一、说明 在使用若依前后端分离打包部署到服务器上后,可能会出现主包无法找到从包中的文件的问题,这个问题通常是由于资源文件没有正确地打包到 jar 包中导致的。本文将介绍如何解决这个问题,包括如何在 Java 代码中访问 jar 包中的资源文件、如何将资源文件复制到系统临时目录中以及如何获取复制后的文件在系统中的绝对路径。 使用若依前后端分离打包部署到服务器上后,主包是ruoyi-admin.jar,如何写路径,才能找到从包下的ruoyi-remote-3.8.5.jar!/burn/burnhex/hex2bin.exe文件? 二、在 Java 代码中访问 jar 包中的资源文件 方法1 使用 ClassLoader 类来加载资源并返回其 URL ClassLoader classLoader = getClass().getClassLoader(); URL resourceUrl = classLoader.getResource("burn/burnhex/hex2bin.exe"); String resourcePath = resourceUrl.getPath(); 在上面的示例中,我们首先获取当前类的 ClassLoader 实例。然后,我们使用 getResource() 方法加载 burn/burnhex/hex2bin.exe 资源,并返回其 URL。最后,我们可以使用 getPath() 方法获取该资源在文件系统中的路径。 在使用 getResource() 方法时,路径应该是相对于类路径的。因此,如果 ruoyi-remote-3.8.5.jar 文件在类路径下,则可以直接使用 burn/burnhex/hex2bin.exe 路径。如果该文件不在类路径下,则您需要使用绝对路径来加载该资源。例如,如果您的 ruoyi-remote-3.8.5.jar 文件在 /opt/ruoyi/lib 目录下,则可以使用以下路径:

编程高手是如何炼成的?1021页Python学习教程,全面专业建议收藏

前言 有人说Python入门一个月足矣,但也仅仅是入门,要想精通甚至成为编程高手,一个月显然不够。 网络上五花八门的Python教程让编程学习者挑花了眼,但大多都是强调入门和基础,无法满足更进一步的需求。要想加深自身竞争力和增加技能傍身,更高层次的学习势在必行。 今天给大家分享一份Python高级学习教程(流畅的Python),共有1021页6大部分,内容全面专业,强调了Python作为编程语言独有的特性,从更高层面系统阐述了Python,是正在使用Python并想进阶的程序员学习的必备资料。 【文末有领取方式!!】 【文末有领取方式!!】 部分目录展示 python使用入门 python如何运行程序 交互式编程 python数字类型 把函数视作对象 一等函数使用一等函数实现设计模式函数装饰器和闭包 控制流程 可迭代的对象、迭代器和生成器上下文管理器和else块协程使用期物处理并发使用asyncio包处理并发 元编程 动态属性和特性属性描述符类元编程 资料领取 这份完整版的Python全套学习资料已为大家备好,朋友们如果需要可以微信扫描下方二维码添加,输入"领取资料" 可免费领取全套资料【有什么需要协作的还可以随时联系我】朋友圈也会不定时的更新最前言python知识。↓↓↓ 或者 【点此链接】领取

AI智能化办公:巧用ChatGPT高效搞定Excel数据分析

文章目录 1. 自动提取关键信息2. 自动生成分析报告3. 自动回答问题4. 自动生成图表《巧用ChatGPT高效搞定Excel数据分析》关键点内容简介作者简介 《AI智能化办公:ChatGPT使用方法与技巧从入门到精通》图书特色内容简介作者简介 随着人工智能技术的不断发展,越来越多的企业开始将其应用于办公场景,以提高员工的工作效率。而在众多办公软件中,Excel无疑是最常用的一款。然而,传统的Excel数据分析方法往往耗时且容易出错。那么,如何利用AI技术提高Excel数据分析的效率呢? 首先,我们需要了解什么是ChatGPT。ChatGPT(全称为“对话生成预训练模型”)是一种基于深度学习的自然语言处理技术,可以理解和生成人类语言。通过大量的文本数据训练,ChatGPT具备了强大的语义理解和生成能力,可以用于各种场景,如智能客服、文本摘要、机器翻译等。 1. 自动提取关键信息 在进行Excel数据分析时,我们通常需要从大量的数据中提取关键信息。而这个过程往往非常繁琐,需要手动筛选和整理。利用ChatGPT,我们可以实现自动提取关键信息的功能。 具体操作如下:首先,将需要分析的数据导入到Excel中;然后,将数据的关键信息输入到ChatGPT中,让ChatGPT自动提取关键信息。这样,我们就可以快速获取到所需的关键信息,大大提高了工作效率。 2. 自动生成分析报告 在完成数据提取后,我们还需要对数据进行分析,并撰写分析报告。这个过程同样非常繁琐,需要花费大量的时间和精力。而利用ChatGPT,我们可以实现自动生成分析报告的功能。 具体操作如下:首先,将分析需求输入到ChatGPT中;然后,让ChatGPT根据分析需求自动生成分析报告。这样,我们就可以快速完成分析报告的撰写,节省了大量的时间和精力。 3. 自动回答问题 在进行Excel数据分析时,我们可能会遇到一些疑问,需要向同事或领导请教。而这个过程往往非常耗时,影响了工作效率。利用ChatGPT,我们可以实现自动回答问题的功能。 具体操作如下:首先,将问题输入到ChatGPT中;然后,让ChatGPT根据问题自动生成答案。这样,我们就可以快速获得所需的答案,提高了工作效率。 4. 自动生成图表 在撰写分析报告时,我们通常需要使用图表来展示数据。而这个过程同样非常繁琐,需要手动绘制图表。利用ChatGPT,我们可以实现自动生成图表的功能。 具体操作如下:首先,将数据和图表需求输入到ChatGPT中;然后,让ChatGPT根据数据和图表需求自动生成图表。这样,我们就可以快速完成图表的绘制,节省了大量的时间和精力。 总之,通过巧用ChatGPT,我们可以实现Excel数据分析的自动化,大大提高了工作效率。当然,ChatGPT并非万能的,我们在实际应用中还需要结合自己的专业知识和经验,才能更好地发挥其优势。 《巧用ChatGPT高效搞定Excel数据分析》 当当:http://product.dangdang.com/29646616.html京东:https://item.jd.com/14256748.html 掌握人工智能神器 C h a t G P T 掌握人工智能神器ChatGPT 掌握人工智能神器ChatGPT 轻松搞定 E x c e l 数据分析 轻松搞定Excel数据分析 轻松搞定Excel数据分析 步骤引导+图解操作+24个实用技巧 配套学习文件+同步视频讲解+精美的PPT课件 利用ChatGPT高效搞定Excel数据处理 提升Excel数据分析的工作效率和质量 关键点 (1)ChatGPT指导,学习简单:利用ChatGPT引导学习,轻松学会各种知识技能 (2)案例翔实,实用性强:案例涵盖各行各业,商业性和实用性强 (3)图文并茂,易学易会:知识讲解步骤引导+图解操作,看书学习不枯燥 (4)实战技巧,高手支招:精选24个实用技巧,对知识查漏补缺和拓展延伸 (5)配套资源,轻松学习:配套学习文件+同步视频讲解+精美的PPT课件 内容简介 本书以Excel 2021办公软件为操作平台,创新地借助当下最热门的AI工具——ChatGPT,来学习Excel数据处理与数据分析的相关方法、技巧及实战应用,同时也向读者分享在ChatGPT的帮助下进行数据分析的思路和经验。 全书共10章,分别介绍了在ChatGPT的帮助下,使用Excel在数据分析中的应用、建立数据库、数据清洗与加工、计算数据、简单分析数据、图表分析、数据透视表分析、数据工具分析、数据结果展示,最后通过行业案例,将之前学习的数据分析知识融会贯通,应用于实际工作中,帮助读者迅速掌握多项数据分析的实战技能。 本书内容循序渐进,章节内容安排合理,案例丰富翔实,适合零基础想快速掌握数据分析技能的读者学习,可以作为期望提高数据分析操作技能水平、积累和丰富实操经验的商务人员的案头参考书,也可以作为各大、中专职业院校,以及计算机培训班的相关专业的教学参考用书。 作者简介 凤凰高新教育,专注于高质量图书策划与出版。集团总裁为知名图书策划人及内容创作者,曾任五月花学院(现希望教育集团)教研总监,负责教学、教材研发和教师培训,具有丰富的教学经验。对Office办公、图形设计、IT新技术等领域有深入研究和独到见解,策划出版了100多本畅销书,包括《Word/Excel/PPT 2019三合一完全自学教程》《精进PPT——PPT设计思维、技术与实践》《Excel数据分析思维、技术与实践》《案例学——Photoshop商业广告设计(全新升级版)》等,广受读者的认可和好评。 《AI智能化办公:ChatGPT使用方法与技巧从入门到精通》 当当:http://product.dangdang.com/29646620.html京东:https://item.jd.com/14256742.html 一本书开启 A I 高效办公时代,成为 A I 时代的先行者 一本书开启AI高效办公时代,成为AI时代的先行者 一本书开启AI高效办公时代,成为AI时代的先行者

19. 删除链表的倒数第 N 个结点(力扣LeetCode)

文章目录 19. 删除链表的倒数第 N 个结点题目描述将删除倒数第n个节点转化为删除第n个节点双指针 19. 删除链表的倒数第 N 个结点 题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2: 输入:head = [1], n = 1 输出:[] 示例 3: 输入:head = [1,2], n = 1 输出:[1] 提示: 链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 1001 <= n <= sz 将删除倒数第n个节点转化为删除第n个节点 先用一个哑节点(虚拟头节点)来简化删除头节点的情况。然后,它通过第一次遍历计算出链表的长度,接着计算出要到达的节点,最后通过第二次遍历找到目标节点的前一个节点。通过修改指针,实现了目标节点的删除,并且在结束前释放了删除节点和哑节点占用的内存。最终返回了新链表的头节点。 删除第n个节点时需要找到前一个节点才能删除 class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* dummyhead = new ListNode(0); // 创建一个哑节点,其值为0,next指向链表的头节点head dummyhead->next = head; ListNode* cur = dummyhead; // 创建一个指针cur,初始化为指向哑节点 int size = 0; while(cur) { // 遍历整个链表来计算链表的长度 cur = cur->next; size++; } cur = dummyhead; // 重置cur指针回到哑节点的位置,准备第二次遍历 int a = size - n - 1; // 计算正向第size-n个节点的索引(因为哑节点的存在,所以要额外减1) while(a--) { // 移动cur指针到正向第size-n个节点的前一个节点上 cur = cur->next; } ListNode* tmp = cur->next; // 创建一个临时指针tmp,指向要删除的节点 cur->next = cur->next->next; // 将要删除节点的前一个节点的next指向要删除节点的下一个节点,从而断开连接 delete tmp; // 删除tmp指针指向的节点,释放内存 ListNode* newHead = dummyhead->next; // 保存新的头节点,即哑节点的下一个节点 delete dummyhead; // 删除哑节点,释放内存 return newHead; // 返回新的头节点 } }; 双指针 通过使用两个指针来实现的,一个快指针(fast)首先向前移动 n 步,然后快指针和慢指针(slow)一起移动直到快指针到达链表尾部。此时慢指针指向的是倒数第 n 个节点的前一个节点。然后该节点被删除,并释放其内存。最后,函数删除了在开始时创建的哑节点(虚拟头节点),并返回链表的新头节点。

操作系统(7)----调度相关知识点(万字总结~)

目录 一.调度的三个层次 1.高级调度 2.低级调度 3.中级调度 二.进程的挂起状态 三.进程调度的时机 四.进程调度方式 1.非剥夺调度方式 2.剥夺调度方式 五.进程的切换与过程 六.调度器/调度程序 1.调度程序 2.闲逛进程 七.评价调度算法的各个指标 1.CPU利用率 2.系统吞吐量 3.周转时间 4.等待时间 5.响应时间 八.调度算法 1.先来先服务算法(FCFS) 2.短作业优先(SJF) 3.高响应比优先(HRRN) 4.时间片轮转调度算法(RR) 5.优先级调度算法 6.多级反馈队列调度算法 7.多级队列调度算法 一.调度的三个层次 1.高级调度 高级调度也称为作业调度,作业即一个具体的任务,用户向系统提交一个作业就相当于用户让操作系统启动一个程序(来处理一个具体的任务),若用户想启动一个程序,那么这个程序所需的所有数据就要从外存调入到内存中。内存空间有限,有时无法将用户提交的作业全部放入内存。这时操作系统就要启动高级调度,决定到底先启动哪个程序: 高级调度会按一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程,每个作业只调入一次,调出一次。作业调入时会建立PCB,调出时才撤销PCB。 2.低级调度 低级调度(进程调度/处理机调度) ,低级调度会按照某种策略从就绪队列中选取一个进程,将处理机分配给它(内存-->CPU)。进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。 3.中级调度 内存不够时,可将某些进程的数据调出外存。等内存空闲或者进程需要运行时再重新调入内存。 暂时调到外存等待的进程状态为挂起状态。被挂起的进程PCB会被组织成挂起队列。 中级调度(内存调度)--就是按照某种策略决定将哪个处于挂起状态的进程重新调入内存。 注:一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。 三个调度的对比: 二.进程的挂起状态 暂时调到外存等待的进程状态为挂起状态 (挂起态,suspend),挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态。所以模型之前学习的五状态模型--->七状态模型 这里注意"挂起"和”阻塞“的区别: 两种状态都是暂时不能获得CPU的服务,但挂起态是将进程映像调到外存去了,而阻塞态下进程映像还在内存中。 注:有的操作系统会把就绪挂起、阻塞挂起分为两个挂起队列,甚至会根据阻塞原因不同再把阻塞挂起进程进一步细分为多个队列。 三.进程调度的时机 进程调度(低级调度),就是按照某种算法从就绪队列中选择一个进程为其分配处理机。 那么什么时候需要进行进程调度与切换 1.当前运行的进程主动放弃处理机 •进程正常终止 •运行过程中发生异常而终止 •进程主动请求阻塞(等待I/O) 2.当前运行的进程被动放弃处理机 例如: •分给进程的时间片用完 •有更紧急的事需要处理(I/O中断) •有更高优先级的进程进入就绪队列 注:有的操作系统只允许进程主动放弃处理机, 有的系统中,进程可以主动放弃处理机,当有更紧急的任务需要处理时,也会强行剥夺处理机 (被动放弃) 什么时候不能进行进程调度与切换 1.在处理中断的过程中,中断处理过程复杂,与硬件密切相关,很难做到在中断处理过程中进行进程切换。 2.进程在操作系统内核程序临界区中。 3.在原子操作过程中(原语) 。原子操作不可中断,要一气呵成如之前讲过的修改PCB中进程状态标志,并把PCB放到相应队列)。 注:注意区分操作系统内核程序临界区与普通的临界区 临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。

24. 两两交换链表中的节点(力扣LeetCode)

文章目录 24. 两两交换链表中的节点题目描述解题思路只使用一个临时节点使用两个临时节点 24. 两两交换链表中的节点 题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head = [1,2,3,4] 输出:[2,1,4,3] 示例 2: 输入:head = [] 输出:[] 示例 3: 输入:head = [1] 输出:[1] 提示: 链表中节点的数目在范围 [0, 100] 内0 <= Node.val <= 100 解题思路 在交换两个相邻节点时,需要找到两个相邻节点的前一个结点,才能进行交换 对于头节点与其相邻的节点,我们只需要使用虚拟头节点就可以交换 只使用一个临时节点 class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode* dummyhead=new ListNode(0); dummyhead->next=head; ListNode* cur=dummyhead; //当节点为偶数时,cur->next指向空指针停止 //当节点为奇数时,cur->next->next为空指针时停止 //cur->next!=nullptr要放在cur->next->next!=nullptr前面,不然会导致空指针异常 //当节点为偶数时,原本cur->next已经指向空指针,cur->next->next!=nullptr放在前面会先判断,从而导致空指针异常 while(cur->next!=nullptr&&cur->next->next!=nullptr) { ListNode* tmp=cur->next;//步骤一:保存1 cur->next=cur->next->next;//步骤二:cur->2 tmp->next=cur->next->next;//步骤三:1->3; cur->next->next=tmp;//步骤四:2->3 cur=cur->next->next;// cur移动两位,准备下一轮交换 } return dummyhead->next; } }; 错误代码

Nginx负载均衡下的webshell连接

一、WebShell简介 “web”的含义是显然 需要服务器开放web服务,“shell”的含义是 取得对服务器某种程度上操作权限。 webshell,顾名思义:web指的是在web服务器上,而shell是用脚本语言编写的脚本程序,webshell就是就是web的一个管理工具,可以对web服务器进行操作的权限,也叫webadmin。webshell一般是被网站管理员用于网站管理、服务器管理等等一些用途,但是由于webshell的功能比较强大,可以上传下载文件,查看数据库,甚至可以调用一些服务器上系统的相关命令(比如创建用户,修改删除文件之类的),通常被黑客利用,黑客通过一些上传方式,将自己编写的webshell上传到web服务器的页面的目录下,然后通过页面访问的形式进行入侵,或者通过插入一句话连接本地的一些相关工具直接对服务器进行入侵操作。 二、搭建环境 1、配置环境 在github上将蚁剑的演示环境下载下来,上传至虚拟机中。 在虚拟机中解压并进行docker compose命令进行拉取 # 将上传的环境文件进行解压 root@ubuntu:~# unzip AntSword-Labs-master.zip root@ubuntu:~# mv AntSword-Labs-master ant # 改名(方便记忆) 进入该目录 root@ubuntu:~# cd ant/loadbalance/loadbalance-jsp/ root@ubuntu:~/ant/loadbalance/loadbalance-jsp# ll total 24 drwxr-xr-x 4 root root 4096 May 17 2021 ./ drwxr-xr-x 3 root root 4096 May 17 2021 ../ -rw-r--r-- 1 root root 373 May 17 2021 docker-compose.yml drwxr-xr-x 2 root root 4096 May 17 2021 nginx/ -rw-r--r-- 1 root root 2557 May 17 2021 README.

Fluid Engine Development PIC/FLIP 代码分析

目录 AnimationPhysicsAnimation初始化固定子步骤数量自适应子步骤数量 GridFluidSolver3初始化步进 求解框架前处理 后处理外部力粘性力 压力平流自适应子步骤数量SDF边界条件外插Grid 的尺寸 Builder构造函数 AdvectionSolverSemiLagrangianforEachIndex parallelForEachIndexsampler GridDiffusionSolverGridForwardEulerDiffusionSolverGridBackwardEulerDiffusionSolver系数矩阵的意义邻居数量 k边界条件系数矩阵的非对角线元素 迭代算法雅可比高斯赛德尔 GridPressureSolverGridSinglePhasePressureSolverGridFractionalSinglePhasePressureSolverA Fast Variational Framework for Accurate Solid-Fluid Coupling基于最小化动能的观点来解释速度投影由动能最小化推出泊松方程边界处压强的计算? GridBoundaryConditionSolverPicSolver构造函数onBeginAdvanceTimeStepupdateParticleEmittertransferFromParticlesToGridsbuildSignedDistanceField computeAdvection FlipSolvertransferFromParticlesToGridstransferFromGridsToParticles 把 Fluid Engine Development 看完了,但是仍然感觉不懂 https://github.com/doyubkim/fluid-engine-dev 感觉还是应该了解整体代码怎么写的,所以做个总结 看着看着,感觉还是从底层开始看起 从底层重新开始看的时候,感觉就来了 而且作者也有很多注释,感觉能够体会到别人的思路 他这里也有很多内容,我选择从 PIC/FLIP 开始看起 然后我选择它的 hybrid_liquid_sim 工程 它的 main 文件就很容易找到了,在 src\examples\hybrid_liquid_sim\main.cpp Animation Animation 类里面提供了 update 函数,update 函数里面调用了虚函数 onUpdate 虚函数 onUpdate 用于给子类提供具体的实现的 这就完成了第一层的抽象,就是把所有的动画都视为一个可以随时间更新的东西 那么我们用户统一地使用 update 函数去更新它 具体怎么更新,那就是程序员怎么在子类中实现虚函数 onUpdate 的事情了 也就是下层(怎么实现虚函数 onUpdate)对上层(用户调用 update)透明 例如,在 src\examples\hybrid_liquid_sim\main.cpp 中,有不同的求解器和情景可供选择,PIC,FLIP,APIC 等 最后这些求解器都进入函数 runSimulation,在其中,求解器的更新都是只需要一句 solver->update(frame);