连接n个字符串而重复的使用+,需要n的平方级别的时间?为什么?

蓝桥杯国赛真题解析:字符串周期与重复模式的高效算法 字符串处理是计算机科学中的基础技术,广泛应用于数据校验、文本分析和生物信息学等领域。其核心原理在于对字符序列的模式识别与高效操作。在算法竞赛和工程实践中,字符串的周期性问题是一个经典且重要的研究方向,它直接关系到数据压缩、模式匹配等技术的实现效率。通过分析字符串的周期性质,我们可以设计出高效的算法来解决诸如“判断字符串是否由子串重复构成”或“最小修改使字符串成为重复字符串”等问题。这类问题通常涉及因子枚举、贪心策略和频率统计等关键技术,能够显著提升代码的性能和健壮性。本文以蓝桥杯国赛真题“重复字符串”为例, 阅读详情

Efftive Java第51条: 当心字符串连接的性能,当连接n个字符串而重复地使用字符串连接操作,需要n的平方级的时间。 

原因:字符串不可变,所以当两个字符串被连接在一起时,它们的内容都需要拷贝。

结论:当需要做多个字符串连接操作时,为了提高性能,应该使用StringBuilder的append方法,如果没有同步(单线程)问题也可以用StringBuffer类的append方法。


问题:为什么为连接n个字符串而重复的使用+,需要n的平方级别的时间?

证明:

第一次        a1+a2

   拷贝次数   1   1

   a1a2=a1+a2 共计1+1+1=3次

第二次          a1a2 + a3

    拷贝次数     2      1

    a1a2a3 = a1+a2+a3 共计 1+2+2*1+1=6次

第三次          a1a2a3 + a4

    拷贝次数     3      1

    a1a2a3 = a1+a2+a3 共计1+2+3+3*1+1=10次

依此类推

第n次           a1a2...a(n-1) + a(n)

    拷贝次数       n-1           1

    a1a2...a(n-1)a(n)  共计 1+2+3+(n-1)+1 = 1+2+3+(n-1)+n = n*(n+1)/2

以a1+a2+a3的连接为例,具体过程图解如下:


上面过程为我自己琢磨的,如果理解有错,望指证。


滑动窗口算法解析:无重复字符最长子串的O(n)解法 滑动窗口是一种高效的算法技术,通过在数据序列上维护一个动态的窗口区间来解决问题。其核心原理是通过双指针协同移动,在遍历过程中实时调整窗口边界,确保窗口内数据满足特定条件。这种技术在字符串处理和数组操作中具有重要价值,能够将暴力解法的O(n²)或O(n³)时间复杂度优化到O(n)。在实际应用场景中,滑动窗口算法广泛用于解决最长无重复子串、最小覆盖子串、字符串排列等经典问题。以LeetCode热题HOT100中的无重复字符最长子串为例,该题目要求找出字符串中不包含重复字符的最长连续子串的长度。通过哈希表记录字符 阅读详情

相关推荐

支付宝支付(三):周期扣款实现注意细节

一、周期扣款实现说明 1、官方文档入口:https://opendocs.alipay.com/open/20190319114403226822/intro 2、根据官方文档说明,周期扣款有两种方式:先签约后代扣场景和支付后签约场景 3、周期扣款接入问题文档: a>https://opendocs.alipay.com/support/01rg24 b>https://opensupport.alipay.com/support/knowledge/50249/20160248753

新鲜雾霾的博客 5699

当心字符串连接的性能

字符串连接操作符“+”是把多个字符串合并成为一个字符串,要想单独产生一行的输出,或者构造一个字符串来表示一个较小的、大小固定的对象,使用连接操作符是非常合适的,但是它不适合运用在大规模的场景中。为链接n个字符串而重复的使用字符串连接符,需要n的平方级的时间,主要是因为字符串不可变导致的不幸结果。 看一个下面的例子: public static void main(String[] args)

wyy6713的专栏 516

人工智能训练师技能等级认定四级技能考核试卷-样题1

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总分100分,考试时间150分钟。试卷涵盖数据处理、模型训练准备及系统维护等核心技能:1)垃圾分类数据集规范与处理(30分),要求评估数据格式并编写Python处理代码;2)学生成绩数据集分析(20分),涉及数据预处理、可视化及相关性分析;3)数据标注审核(10分),重点审核标注准确性;4)智能数据服务系统维护与优化(40分),包括安全帽数据集的项目创建、数据处理及平台协作。考核强调Python编程、数据处理平台操作及AI工作流程的实践能力。

weixin_42221934的博客 440

字符串连接引起的性能问题

不要使用字符串连接操作符来合并多个字符串,除非性能无关紧要。相反,应该使用StringBuilder的append方法。

北辰 398

智能体在车联网中的应用:第19天 智能体理论与初步实践 D30:阶段小结——在SUMO中使用TraCI控制预编程智能体

本文介绍了如何将强化学习从算法仿真迁移到交通系统实践,重点讲解了SUMO微观交通仿真平台与TraCI实时控制接口的架构。通过构建一个预编程驾驶智能体,演示了车辆从起点到目标点的导航控制。文章详细解析了TraCI的双向通信机制和事件驱动模型,对比了其与传统RL环境的差异,并提供了完整的Python实现框架,包括路网配置、车辆控制和基于向量场的导航逻辑。该实践为后续开发高级学习型交通智能体奠定了基础。

IT深耕十余载,大道之简 1478

Libero SoC v2021.1离线安装与IP核配置全攻略

本文详细介绍了Libero SoC v2021.1在离线环境下的完整安装与配置流程。核心内容包括如何选择正确的离线安装包、获取并配置许可证、安装与挂载MegaVault IP库,以及将ModelSim仿真器切换至免费SE模式的关键步骤。文章旨在帮助内网开发者避开常见陷阱,顺利完成FPGA开发环境的搭建。

weixin_29279101的博客 406

算法第4版(谢路云译)学习笔记(3) -- 字符串连接操作的时间复杂度

比如连接算字符串是一个重要的操作, 如果连接两个字符串,运行时间与字符串的长度成正比。很多新手使用Java编程时,错把连接字符串当做是常数时间的操作,而实际上并不是。 operation:         string concatenation example:           s + t nanoseconds: c*N

Henry1991back的博客 1858

BLDC方波控制 vs. FOC:技术选型指南与未来演进

本文深入对比BLDC电机方波控制与FOC技术的核心差异,分析两者在成本、性能和应用场景上的权衡。方波控制凭借低成本和易实现性,在电动工具和家电领域优势明显;而FOC则以平滑高效控制见长,适用于高端精密应用。文章为工程师提供了实用的技术选型指南,并展望了未来技术融合的发展趋势。

yhn4567890的博客 1172

重复N个字符连成一个字符串,各种JDK版本的方式优雅实现

重复N个字符连成一个字符串,比如生成5个连续的a的字符串aaaaa 最不用动脑筋的方法就是for循环里面用String/StringBuffer/StringBuilder等把string拼接起来 下面介绍稍微优雅一点的实现 详见我的博客 https://blog.terrynow.com/2021/01/10/java-repeat-a-string-n-times/ ...

yaoxinghuo的专栏 1329

【人脸识别】基于 Gabor+SVM和PCA+SVM实现人脸识别matlab源码含 GUI

1 简介 随着经济的快速发展,互联网的普及,信息安全逐渐被人们所重视。人脸识别技术作为保护信息安全的重要手段之一,也逐渐被研究学者所重视。人脸识别作为计算机视觉技术和生物特征识别技术的一个重要分支,模式识别与人工智能的一个重要领域,其主要任务是对静态图像或动态视频进行识别。如何快速的正确的对人脸进行识别是目前人脸识别课题的一个难题。人脸识别算法的选取直接关系到人脸识别的识别率。 本文首先介绍了国内外人脸识别的发展现状,并对人脸图像预处理方法进行了详细阐述。图像预处理的方法有很多,主要包括:灰度变换、图像锐

qq_59747472的博客 1136

YOLOv8交通监控全方案:精准车辆计数+违章(闯红灯/压线)识别,拿来就落地!

作为深耕计算机视觉落地的开发者,我见过太多交通监控的“伪智能”——传统系统要么车辆计数不准(漏计/重复计数),要么违章识别滞后(靠人工回看录像),甚至连“闯红灯、压线”这类常见违章都无法实时判定,完全满足不了实际交通管理需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 646

C++ STL中常见容器的时间复杂度

map, set, multimap, and multiset 上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种。不同操作的时间复杂度近似为: 插入: O(logN) 查看:O(logN) 删除:O(logN) hash_map, hash_set, hash_multimap, and hash_multiset 上述四种容器采用哈希表实现,不同操作的时间复杂度为:

wusecaiyun的专栏 4万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LeetCode.961-2N数组中N次重复的元素(N-Repeated Element in Size 2N Array)

这是悦乐书的第365次更新,第393篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第227题(顺位题号是961)。在大小为2N的数组A中,存在N+1个唯一元素,并且这些元素中的一个重复N次。 返回重复N次的元素。例如: 输入:[1,2,3,3] 输出:3 输入:[2,1,2,5,3,2] 输出:2 输入:[5,1,5,2,5,3,5,4] 输出:5 注意: 4 &...

weixin_34405557的博客 494

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

LeetCode -- 3.无重复字符串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。 示例 3: 输入: “pwwkew” 输出: 3 解释: 因为无重复字...

m0_37531129的博客 250

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

字节微软面试题——459. 重复的子字符串

给定一个非空的字符串s,检查是否可以通过由它的一个子串重复多次构成。

weixin_45942644的博客 507

【无重复字符的最长子串】

【无重复字符的最长字串】——双指针+哈希表,使用Python求解

weixin_70673823的博客 2110

最小表示法:O(n)时间解决循环字符串字典序比较的算法精讲

在字符串处理领域,字典序比较是基础且核心的操作,它决定了字符串排序、匹配等关键行为的逻辑。其原理是基于字符的编码顺序进行逐位比较,广泛应用于数据排序、搜索引擎索引和数据库查询优化。对于循环字符串(即首尾相连的字符串),判断其所有循环同构串中字典序最小(或最大)的表示,是一个经典问题。暴力枚举所有起点的O(n²)方法在处理大规模数据(如10⁵级别)时效率低下。最小表示法(Minimum Representation)通过双指针贪心策略,巧妙地利用已比较信息跳过无效状态,将时间复杂度优化至O(n),体现了算法竞

weixin_33841722的博客 355

leetcode459. 重复的子字符串

​暴力枚举法:直观且容易实现,但效率较低,适用于小规模数据。​优化点:通过整除检查快速跳过不可能的子串长度,减少无效匹配。​适用场景:适合题目中字符串长度较短的情况。对于大规模字符串,可采用更高效的算法(如 KMP 或字符串拼接法)。

m0_49844997的博客 461

java输入长度为n的字符串_在Java中使用递归来打印长度为N的位字符串的排列

我正在尝试获取表示长度为N的位字符串的可能排列的整数数组的链表,例如对于N = 200011011我成功地编写了将位表示为字符串的代码,如下所示:public static LinkedList printBin(String soFar, int iterations) {if(iterations == 0) {LinkedList ret = new LinkedList();ret.add...

weixin_28622215的博客 715

最小表示法:O(n)时间解决循环字符串字典序问题

在字符串算法领域,字典序比较是基础且核心的操作,它决定了字符串排序、匹配等一系列问题的解决方式。其原理基于字符的ASCII码或Unicode值逐位比较,广泛应用于数据排序、搜索引擎索引和数据库查询优化。当处理首尾相连的循环字符串时,暴力比较所有循环同构串的字典序会导致O(n²)的时间复杂度,成为性能瓶颈。最小表示法(Minimal Representation)正是针对这一场景的高效算法,它通过双指针跳跃比较,利用已比较信息跳过无效位置,将复杂度优化至O(n)。该算法在力扣周赛等编程竞赛中价值显著,能快速解

weixin_30813225的博客 511

蓝桥杯真题解析:贪心算法求解字符串最小修改为重复串问题

字符串周期性问题在算法竞赛和面试中频繁出现,其核心是分析给定字符串能否由某个子串重复构成。这类问题通常涉及字符串处理、子串匹配和周期判断等基础概念。其核心原理在于,若目标重复子串长度为K,则原字符串长度N必须能被K整除。基于此,一种高效的贪心策略是:对于每个候选长度K,将字符串划分为N/K个长度为K的块,然后独立地处理每个块中相同位置的字符。通过统计每个位置上所有块字符的出现频率,并选择频率最高的字符作为目标字符,可以最小化该位置的修改次数。这种分位置独立贪心的方法,避免了枚举所有可能目标子串的复杂度,体现

weixin_33875564的博客 427

C++字符串处理:右旋、子串匹配与重复判断

字符串处理是编程基础中的核心技能,涉及内存管理、算法优化等关键技术点。从原理上看,字符串操作本质是对字符数组的线性处理,需要特别注意边界条件和时空复杂度。在工程实践中,高效的字符串算法能显著提升系统性能,比如KMP算法通过预处理模式串将子串匹配复杂度从O(m*n)优化到O(m+n)。常见的应用场景包括文本编辑器、编译器解析和数据处理等。本文通过右旋字符串、strStr()实现和重复子串判断三个典型案例,展示了如何结合反转技巧、KMP算法等热词相关技术解决实际问题,特别适合准备技术面试或夯实基础的开发者参考。

weixin_29310631的博客 131

Leetcode刷题笔记——剑指 Offer 48. 最长不含重复字符的子字符串(中等)

文章目录题目描述解题思路方法一:动态规划+哈希表复杂度分析C++代码实现方法二:动态规划+线性遍历复杂度分析C++代码实现方法三:双指针 + 哈希表复杂度分析C++代码实现参考链接 题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 解题思路 长度为 NNN 的字符串共有 (1+N)N2\frac{(1 + N)N}{2}2(1+N)N​ 个子

weixin_39739042的博客 694

无重复字符串-leetCode-003

滑动窗口的左右指针(left和right)各自最多移动 n 次。在最坏情况下,每个字符都被访问一次。对于每个字符,我们进行以下操作:在HashSet中添加或移除字符。这些操作的平均时间复杂度是 O(1)。判断字符是否在HashSet中。这个操作的平均时间复杂度也是 O(1)。

m0_74287204的博客 318
上一篇: String s=new String("abc")创建了几个对象?
下一篇: 《java未眠夜》书摘
cuidiwhere
博客等级 码龄19年 133粉丝 102原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值