字符串截取问题及程序输出优化:如何让'e'仅显示一次?
Hey there! Let's tackle your two questions one by one, nice and clear.
字符串截取是日常开发里高频用到的操作,不同编程语言的实现思路大同小异,但细节上有不少需要注意的地方。我整理了几种主流语言的常用方法和坑点:
Python:用切片语法,简单直观
s = "Hello Stack Overflow" # 截取索引2到5的字符(左闭右开) sub_s = s[2:5] # 结果是 'llo' # 从开头截取到索引5 sub_s = s[:5] # 'Hello' # 从索引5截取到末尾 sub_s = s[5:] # ' Stack Overflow' # 负数索引(从末尾倒数) sub_s = s[-10:-5] # 'verfl'注意:Python的字符串切片不会因为索引越界报错,只会返回空字符串或者尽可能多的字符;处理多字节字符(比如中文)也很友好,因为默认用Unicode编码。
JavaScript:常用
slice()和substring()const s = "Hello Stack Overflow"; // slice用法和Python类似,支持负数索引 let sub_s = s.slice(2, 5); // 'llo' sub_s = s.slice(-10, -5); // 'verfl' // substring会自动处理索引顺序(如果起始大于结束,会交换),不支持负数索引 sub_s = s.substring(5, 2); // 等价于s.substring(2,5),结果'llo'注意:处理Unicode辅助字符(比如emoji)时,因为JS字符串是UTF-16编码,单个emoji可能占两个码元,直接截取可能导致字符损坏,需要用
Array.from()先转成数组再处理。Java:用
substring()方法String s = "Hello Stack Overflow"; // 从索引2开始到索引5结束(左闭右开) String sub_s = s.substring(2, 5); // 'llo' // 从索引5开始到末尾 sub_s = s.substring(5); // ' Stack Overflow'注意:Java的
substring()如果索引越界会抛出StringIndexOutOfBoundsException,处理中文没问题,但同样要注意Unicode辅助字符的情况。
通用注意点:
- 确认索引的起始规则(大多是0开始,左闭右开)
- 处理多字节/Unicode字符时,避免截断导致乱码
- 有些语言提供了按长度截取的方法,比如PHP的
substr(),要区分按索引和按长度的差异
字符'e'显示两次,大概率是代码逻辑里出现了重复输出或者重复收集的情况。我举几个常见场景和修复方案:
场景1:重复执行了输出语句
比如下面的Python代码,不小心在循环里两次打印了'e':
text = "Hello there!" for char in text: if char == 'e': print(char) # 第一次打印 print(char) # 第二次打印,导致'e'被输出两次
修复:去掉多余的输出语句,或者调整条件判断的范围:
text = "Hello there!" for char in text: if char == 'e': print(char) # 只在符合条件时打印一次
场景2:数据源里本身有重复的'e',但需要去重后输出
比如要提取字符串里的唯一字符并打印,结果包含重复的'e':
text = "eeHello" chars = [] for char in text: chars.append(char) print(''.join(chars)) # 输出'eeHello',其中'e'显示两次
修复:用集合去重(注意集合会打乱顺序),或者遍历的时候判断是否已经添加过:
text = "eeHello" chars = [] seen = set() for char in text: if char not in seen: seen.add(char) chars.append(char) print(''.join(chars)) # 输出'eHlo',每个字符只显示一次
场景3:逻辑分支重复触发输出
比如在多个条件分支里都打印了'e':
score = 85 if score >= 80: print('e') # 分支1打印 if score >= 60: print('e') # 分支2也打印,导致重复
修复:用elif替代第二个if,确保只有一个分支执行:
score = 85 if score >= 80: print('e') elif score >= 60: print('pass')
如果你的代码是其他语言,核心思路都是一样的:检查是否有重复执行的输出逻辑,或者是否需要对数据源进行去重处理。要是能贴出你的具体代码,我还能更精准地帮你定位问题~
内容的提问来源于stack exchange,提问作者Larry Teischwilly

