原创 Python的基础语法
本文介绍了Python基础语法的核心要素:1.标识符命名规则(区分大小写、字符限制、避免关键字冲突);2.33个关键字的特殊功能(如as、nonlocal、yield的用法示例);3.变量的动态类型特性;4.代码注释规范(#用法和编码声明);5.模块导入机制(import、from...import及别名设置)。
2025-12-01 21:01:01
223
原创 动手----编写和运行第一个Hello World程序
本文介绍了Python程序的两种编写运行方式:交互式和文件式。交互式适合学习基础语法,通过Python Shell或IDLE即时执行代码;文件式适合复杂程序,需先编写.py文件再用Python指令运行。
2025-11-30 08:56:59
198
原创 搭建Python开发环境
Python安装指南:从官网(www.python.org)下载安装包,内含解释器、基础库和交互工具。安装时勾选"Add python.exe to Path"将Python添加到环境变量,方便全局使用。点击"Install Now"开始安装,完成后可通过python -V或python --version命令验证安装是否成功。
2025-11-28 13:02:25
359
原创 Python每日一练---第二十二天:串联所有单词的子串
本文介绍了如何在给定字符串s和字符串数组words中查找所有串联子串的起始位置。串联子串需包含words中所有字符串以任意顺序排列连接而成。文章通过滑动窗口算法实现,统计words中单词出现次数,遍历s中所有可能的起始位置,检查符合条件的子串。符串匹配问题。
2025-11-24 13:10:06
39
原创 SpringBoot的启动过程(1)
摘要:本文分析了SpringBoot应用程序的启动过程,重点解析了SpringApplication.run()方法的执行流程。该方法作为SpringBoot应用的入口点,负责初始化引导类、创建应用上下文、配置环境参数等核心操作。文章详细介绍了启动过程中涉及的BootstrapRegistryInitializer、ApplicationContextInitializer等关键组件的作用,以及SpringBoot 3.x版本中引入的Startup计时机制。
2025-11-23 10:52:10
368
原创 Python每日一连---第二十一天:无重复字符的最长字串
本文介绍了如何用Python解决查找字符串中最长无重复字符子串的问题。采用滑动窗口算法,通过维护左右指针和字符位置字典来高效查找最长子串。算法核心是当遇到重复字符时移动左指针,并始终记录字符最新位置。代码实现简洁,时间复杂度为O(n),适用于处理最长5×10^4长度的字符串
2025-11-22 14:50:42
27
原创 Python每日一练---第二十天:长度最小的子数组
本文介绍了使用滑动窗口算法在Python中寻找满足和≥target的最短连续子数组的方法。通过双指针(fast和slow)控制窗口边界,动态调整窗口大小:右指针扩展窗口求和,左指针收缩窗口优化长度。时间复杂度为O(n),适用于全正数数组。代码示例展示了具体实现,当窗口和≥target时记录最小长度,最终返回结果。
2025-11-21 22:44:44
11
原创 Python每日一练---第十九天:反转字符串中的单词
本文介绍了两种Python反转字符串中单词顺序的方法:1. 使用内置函数s.split()[::-1]分割后反转再连接,简洁高效;2. 利用栈结构,遍历字符串构建单词,遇到空格压栈,最后弹出连接实现反转。两种方法都能处理多余空格问题,确保结果中单词间仅保留单个空格。
2025-11-20 23:05:04
422
原创 核心注解@SpringBootApplication的三大秘密
本文详解了SpringBoot核心注解@SpringBootApplication的三大组成部分:1)@SpringBootConfiguration标识主配置类;2)@EnableAutoConfiguration实现自动配置,通过条件化装配和扫描spring.factories文件加载配置;3)@ComponentScan自动扫描组件。这三个注解协同工作,使开发者仅需一个注解就能快速启动功能完备的SpringBoot应用,体现了约定优于配置的设计理念。
2025-11-20 22:23:31
156
原创 Python每日一练---第十八天:最长公共前缀
本文介绍了如何用Python编写函数查找字符串数组中的最长公共前缀。算法思路是以第一个字符串为初始前缀,依次与后续字符串比较,通过不断缩短前缀来寻找公共部分。若在比较过程中前缀为空,则直接返回空字符串。示例代码演示了该方法的实现,时间复杂度为O(n*m),其中n是字符串数量,m是最短字符串长度。该方法能正确处理不存在公共前缀的情况,返回空字符串。
2025-11-19 22:16:56
216
1
原创 项目结构深度解析:理解Spring Boot项目的标准布局和约定
摘要:本文深度解析SpringBoot项目的标准结构及其"约定优于配置"理念。通过分析典型的Maven项目结构,展示了src/main/java核心代码组织、resources资源目录配置、test测试代码规范等关键部分。重点阐述了标准结构如何实现自动配置,包括组件扫描规则、分层架构约定、静态资源处理等机制。同时指出在特殊需求下可打破约定的场景,如自定义配置路径或组件扫描范围。这种标准化结构带来的好处包括快速启动、低配置、项目一致性及工具友好性,体现了SpringBoot自动配置核心思想
2025-11-19 13:10:36
563
原创 Python每日一练---第十七天:整数转罗马数字
本文介绍了将整数转换为罗马数字的算法实现。罗马数字由特定符号组合表示,转换时需要遵循特殊规则(如4和9需用减法表示)。算法采用贪心策略,预先定义包含特殊情况的降序映射表(如1000→"M",900→"CM"),然后从高到低依次匹配最大符号值。通过循环减去对应数值并拼接符号,最终得到罗马数字表示。该方法确保了正确转换所有1-3999范围内的整数,时间复杂度为O(1)。
2025-11-18 22:59:02
164
原创 Python每日一练---第十六天:加油站
这篇Python练习讲解如何判断汽车能否绕环形加油站一周行驶。给定汽油数组gas和消耗数组cost,算法首先比较总汽油和总消耗量,若不足则返回-1。否则通过贪心算法遍历加油站:跟踪当前剩余油量,若油量不足则重置起点,最终若总油量足够则返回起点编号。
2025-11-17 21:03:07
1044
原创 Python每日一练---第十五天:三数之和
本文介绍了如何用Python解决三数之和为0的问题。算法思路是对数组排序后固定一个数,再用双指针法查找满足条件的另外两个数,同时跳过重复元素。代码实现中先排序数组,然后遍历每个元素,对于当前元素,使用左右指针寻找和为0的组合,并处理重复情况,最终返回所有不重复的三元组。
2025-11-13 13:22:50
288
原创 Python每日一练---第十四天:两数之和II - 输入有序数组
本文介绍了一种使用双指针算法在非递减排序数组中寻找两数之和等于目标值的解决方案。算法通过初始化左右指针分别指向数组首尾,根据当前和与目标值的比较动态调整指针位置:和小于目标则左移,大于则右移。最终返回满足条件的下标(从1开始计数)。该方法保证在O(n)时间复杂度和常量空间复杂度内解决问题,适用于唯一解的情况。
2025-11-12 22:16:50
785
原创 Python每日一练---第十三天:判断子序列
本文介绍了如何判断字符串s是否为字符串t的子序列。通过双指针法,一个指针遍历s,另一个遍历t,依次匹配字符。匹配成功则同时移动两个指针,否则只移动t的指针。最终如果s指针走完全程,说明s是t的子序列。该算法时间复杂度为O(m+n),空间复杂度O(1),适用于单次查询。文中提供了Python实现代码,并解析了算法思路,简单直观且高效。
2025-11-12 13:04:04
419
原创 Python每日一练---第十二天:验证回文串
本文介绍了一个判断字符串是否为回文串的Python算法。算法核心是忽略大小写和非字母数字字符,使用双指针从两端向中间比较字母数字字符是否对称。时间复杂度为O(n),空间复杂度为O(1)。代码示例展示了如何处理带标点的字符串,如"A man, a plan, a canal: Panama"能正确识别为回文,而"race a car"则不是。空字符串和简单回文也通过了测试验证。
2025-11-11 23:21:21
351
原创 Python每日一练---第十一天:除自身以外数组的乘积
本文介绍了如何在O(n)时间复杂度内,不使用除法的情况下计算数组中除自身外所有元素的乘积。通过构建左右前缀积数组,实现每个元素的乘积计算。算法先从左到右计算左前缀积,再从右到左计算右前缀积,最后将两者相乘得到结果。该方法高效解决了LeetCode上"除自身以外数组的乘积"问题,保证了时间复杂度和空间效率。
2025-11-10 13:08:13
240
原创 ELK Stack架构深度解析:从零搭建千万级日志分析平台(LogStash部署)
Logstash是一个开源的ELK Stack核心组件,用于数据收集、处理和转发。其管道式架构包含input(数据输入)、filter(数据处理)和output(数据输出)三大模块,支持多种插件如File、Kafka、Grok、Elasticsearch等。Event是Logstash内部数据处理的基本单位,包含原始数据和元数据。Codec负责数据编解码,支持json、plain等格式。安装时需配置JDK环境,并通过简单命令测试运行。调试可通过多阶段stdout输出或条件标签实现,使用rubydebug格式
2025-11-09 21:41:49
1175
原创 Python每日一练---第十天:买卖股票的最佳时机II
本文介绍了使用Python解决股票最佳买卖时机问题的算法。题目要求在最多持有一只股票的条件下,通过多次买卖获得最大利润。算法思路是遍历每日价格,只要第二天价格高于当天就进行买卖,将所有上涨收益累加。代码实现了一个简单的循环来比较相邻两天的价格差并累加利润,最终返回最大总利润。该方法可以处理所有可能的上涨情况,实现利润最大化。
2025-11-08 09:01:05
277
原创 Python每日一练---第九天:H指数
本文介绍了如何计算研究者的h指数。h指数定义为研究者有h篇论文,每篇至少被引用h次。算法思路是从最大可能的h值开始递减,统计引用次数小于h的论文数量,并与允许的低引用论文数比较。Python实现通过遍历数组进行统计,找到满足条件的最大h值。
2025-11-07 22:33:50
350
原创 Python每日一练---第八天:最后一个单词的长度
Python编程题:计算字符串中最后一个单词的长度。题目要求找出由字母组成、不包含空格的最后一个子串的长度。算法采用从字符串末尾逆向遍历的方式:先跳过末尾空格定位单词结尾,再向前计数直到遇到空格或开头。时间复杂度O(n),空间复杂度O(1),高效避免了分割字符串操作。代码示例展示了具体实现过程。
2025-11-06 21:58:40
269
原创 Python每日一练---第七天:跳跃游戏II
本文介绍了使用贪心算法解决数组跳跃问题,寻找到达终点的最小跳跃次数。算法通过维护当前可达范围和在每一步选择能跳得最远的位置来优化跳跃策略。具体实现时,遍历数组时记录当前跳跃边界和下一步能到达的最远位置,当到达边界时更新跳跃次数。以示例[2,3,1,1,4]为例,只需2次跳跃即可到达终点。该算法时间复杂度为O(n),空间复杂度O(1),高效地解决了问题。
2025-11-06 13:12:24
869
原创 Python每日一练---第六天:罗马数字转整数
本文介绍了将罗马数字转换为整数的Python实现方法。首先解释了罗马数字的基本规则和六种特殊情况,如IV=4、IX=9等。然后提出了从左到右遍历字符串的算法思路,比较当前字符与下一个字符的值,处理特殊情况时跳过下一个字符。提供了两种代码实现:一种是常规的左到右遍历方法,另一种是从右到左的优化遍历方法。两种方法都能正确处理罗马数字到整数的转换,示例验证了代码的正确性,如"MCMXCIV"被正确转换为1994。该练习有助于提高编程能力和逻辑思维能力。
2025-11-05 22:24:02
1095
原创 Python每日一练---第五天:轮转数组
本文介绍了Python中实现数组轮转的几种方法。给定整数数组nums和轮转次数k,通过三步反转法(整体反转→前k个反转→剩余元素反转)实现高效轮转,时间复杂度O(n),空间复杂度O(1)。文章还对比了其他实现方式:逐步移动法(效率低)、额外数组法(直观但空间高)以及Python切片法(简洁)。其中三步反转法在效率和代码简洁性上表现最佳,是最优解。不同方法各具特点,可根据实际需求选择合适算法。
2025-11-04 21:47:25
333
原创 Python每日一练---第四天:多数元素
本文介绍了两种Python解决数组多数元素问题的方法。题目要求找出出现次数超过数组长度一半的元素。第一种方法使用字典统计元素频率,时间复杂度O(n),空间复杂度O(n)。第二种采用Boyer-Moore投票算法,通过计数变量高效地找到多数元素,空间复杂度O(1)。文章包含算法思路、代码实现和示例分析,帮助读者理解这两种解决多数元素问题的方法。
2025-11-04 13:10:45
269
原创 Python每日一练---第三天:删除有序数组中的重复项
本文介绍了如何使用Python解决有序数组去重问题,要求保留最多两个重复元素。通过滑动窗口和双指针两种方法实现:第一种方法使用滑动窗口检测重复区间,当长度超过2时删除多余元素,时间复杂度O(n²);第二种优化方案采用双指针法,只需O(n)时间,通过比较当前元素与前两个位置的元素来决定保留与否,效率更高。文章包含问题描述、分析思路和代码实现,帮助读者理解如何在原地修改数组并满足空间复杂度要求。
2025-11-03 23:29:45
658
原创 Python每日一练---第二天:合并两个有序数组
本文介绍了如何合并两个有序数组nums1和nums2,要求结果存储在nums1中。主要思路是从数组末尾开始比较元素,将较大值依次放入nums1的尾部。若nums2还有剩余元素,则直接拷贝。算法使用三个指针分别跟踪nums1有效数据末尾、nums2末尾和合并位置。代码实现展示了如何高效完成这一合并操作,时间复杂度为O(m+n),空间复杂度为O(1)。该解法适用于处理有序数组合并问题。
2025-11-03 13:18:48
1100
原创 Python每日一练---第一天:买卖股票的最佳时机
本文介绍了解决股票买卖最大利润问题的两种方法。问题要求在给定股价数组中找到单次买卖的最大利润。暴力枚举法效率低,会超时;更优解是动态规划思路,通过一次遍历,记录最低价和当前最大利润,时间复杂度O(n)。两种方法代码实现都已给出,动态规划思路解法更高效。
2025-11-02 21:17:44
1339
原创 ELK Stack架构深度解析:从零搭建千万级日志分析平台(kafka部署)
本文介绍了Kafka 4.1.0集群的部署与架构。主要内容包括:1)采用KRaft协议(无需Zookeeper)搭建三节点集群,详细说明配置参数和启动流程;2)讲解Kafka架构组件,重点说明生产者的消息发送机制(含Spring Boot集成示例)和消费者的分区订阅策略;3)分析Broker存储结构和Topic分区/副本特性。文章还提供了实际部署中的注意事项,如生产者分区策略配置、消费者与分区数匹配等常见问题解决方案。
2025-11-01 20:13:19
771
原创 ELK Stack架构深度解析:从零搭建千万级日志分析平台(filebeat部署)
Filebeat是Elastic Stack中的轻量级日志采集工具,可将日志数据传输至Elasticsearch、Logstash或Kafka进行处理。文章介绍了三种工作模式及其适用场景:直接输出到Elasticsearch适合小型系统;通过Logstash处理适合中等规模日志;引入Kafka缓冲适合大规模数据场景。详细说明了Linux环境下通过apt-get或安装包两种安装方式,重点解析了filebeat.yml配置文件的核心模块(输入、处理、输出)配置方法。
2025-10-25 15:41:59
702
原创 解决XXL-JOB账号被挤下线的烦恼:支持多地点同时登录的秘籍
XXL-JOB升级新版本后出现登录机制问题,导致团队协作时频繁跳转登录界面。通过分析发现,问题根源在于SSO模块的token生成方式——每次登录生成随机UUID会使之前会话失效。解决方案是修改LoginInfo生成逻辑,使用固定签名值替代随机UUID,从而避免会话冲突。这种方案虽然牺牲了部分安全性,但显著提升了团队协作效率,特别适合对安全性要求不高的测试环境或内部网络。该方案在安全性和便捷性之间取得了平衡,可根据实际项目需求灵活采用。
2025-10-15 13:04:35
457
原创 “Fontconfig head is null”错误的终极排查与修复
摘要:Java应用在Linux服务器上生成Excel时出现"Fontconfig head is null"错误,原因是缺少fontconfig字体管理系统。解决方案包括:1) 通过sudo apt install fontconfig安装组件;2) 使用fc-list验证安装;3) 针对内网环境提供手动拷贝fontconfig文件的方法(含路径说明)。文中还附带了测试工程代码,演示了Spring Boot集成EasyExcel的导出功能。该问题本质是服务器字体配置缺失,与代码无关。
2025-10-12 22:19:15
1372
原创 记生产OOM的故障分析
JVM是Java平台的一部分,负责将Java字节码转换为机器指令并在不同的操作系统上执行。它屏蔽了底层硬件和操作系统的差异,使得“一次编写,到处运行”的理念得以实现。内存溢出的分析需要用到jmap,jhat命令。
2024-02-26 21:45:40
1143
2
原创 MySQL数据库主从复制
其中主从复制时一种关键的高可用和数据冗余技术,通过将主服务器上的所有更改的数据实时或者近乎实时地复制到从服务器上,确保了数据的安全备份。从服务器接收到主服务器的binlog内容后,会将其存储在本地的relay log中,从服务器上的SQL线程负责读取relay log中的事件,并在本地按照相同的顺序执行这些事件,从而实现与主服务器的数据同步。主从复制的核心是“主库写入,从库读取”,主库负责处理所有的写操作,并生成binlog日志,从库接收并执行这些binlog中的变更操作,从而达到与主库的数据同步。
2024-02-03 20:12:10
707
1
原创 MySQL数据库的锁机制
MySQL数据库的锁是控制并发访问和事务处理中数据一致性的一种机制。在多用户环境或并发事务环境下,不同的事务同时尝试对相同的数据进行读取或修改操作,为了防止多个事务间相互干扰导致数据不一致问题,数据库系统使用锁来确保同一时刻只有一个事务能够对特定资源进行写入操作。
2024-01-24 23:00:00
1469
1
原创 从0到1实战微服务架构之Nacos服务注册、发现与管理
Nacos是一个开源的、易于构建云原生应用的动态服务发现、配置管理和服务管理平台。本文将介绍服务发现、配置和管理。
2024-01-21 10:19:19
604
原创 进程和线程的比较
进程是程序执行相关资源(CPU、内存、磁盘等)分配的最小单元,是一系列线程的集合,进程之间相互独立,有自己的内存空间;线程是CPU资源分配的最小单元,线程需要的资源更少,可以看做是一种轻量级的进程,线程会共享进程中的内存,但线程使用独立的栈、程序计数器,线程相互通信更加方便。在项目开发中,经常会用到线程以及多线程功能来实现异步任务处理等。项目上线之后,如果出现服务CPU高的异常情况,那么这个时候就需要借助Linux(因为一般情况服务都是使用Linux)查看进程、线程来定位最终的问题。
2024-01-13 18:50:30
1456
1
原创 从0到1实战微服务架构之Nacos下载安装
Nacos是一个开源的、易于使用的、功能丰富的平台,用于构建云原生应用,具有服务发现、服务检测、动态配置管理等功能。本篇就来介绍如何使用nacos搭建注册中心。Nacos是Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
2024-01-10 22:24:53
1933
1
原创 Spring Framework和SpringBoot的区别
作为Java程序员,我们都听说过Spring,也都使用过Spring的相关产品,它使每个人可以快速、轻松地、安全地进行Java编程开发,它是迄今为止世界上最受欢迎的Java框架。本文介绍Spring、Spring Framework、SpringBoot之间的关系和区别。
2024-01-07 22:22:31
4728
2
RSS订阅