华为OD机试_2025 B卷_按单词下标区间翻转文章内容(Python,100分)(附详细解题思路)

题目描述

给定一段英文文章片段,由若干单词组成,单词间以空格间隔,单词下标从0开始。
请翻转片段中指定区间的单词顺序并返回翻转后的内容。

例如给定的英文文章片段为"I am a developer",翻转区间为[0,3],则输出“developer a am I”。

String reverseWords(String s, int start, int end)

输入描述
使用换行隔开三个参数

第一个参数为英文文章内容即英文字符串
第二个参数为待翻转内容起始单词下标
第三个参数为待翻转内容最后一个单词下标
输出描述
翻转后的英文文章片段所有单词之间以一个半角空格分隔进行输出。

备注
英文文章内容首尾无空格

用例

输入 I am a developer.
1
2
输出 I a am developer.
说明
输入 hello world
-1
1
输出 world hello
说明 下标小于0时,从第一个单词开始
输入 I am a developer
0
5
输出 developer a am I
说明 下标大于实际单词个数,则按最大下标算
输入 I am a developer
-2
-1
输出 I am a developer
说明 翻转区间无效时,不做翻转

英文片段单词翻转算法详解

核心解题思路

本题目要求翻转英文片段中指定区间的单词顺序。核心解题思路可分为以下几步:

关键步骤

  1. 分割单词:将输入字符串按空格分割为单词列表
  2. 边界处理:处理起始和结束下标的特殊情况:
    • 起始下标 < 0:视为0
    • 结束下标 ≥ 单词数:视为最后一个单词下标
    • 起始 > 结束:直接返回原字符串
  3. 区间翻转:反转指定区间内的单词顺序
  4. 重组字符串:将单词列表重新组合为字符串

关键点说明

  • 有效区间判断:仅当start <= end时执行翻转
  • 边界包含:翻转区间包含起始和结束位置的单词
  • 原地翻转:直接修改单词列表的子区间
  • 空格处理:输出时用单个空格连接单词

完整代码实现

def reverseWords(s, start, end):
    # 分割字符串为单词列表
    words = s.split()
    n = len(words)
    
    # 边界处理
    if start < 0:
        start = 0
    if end >= n:
        end = n - 1
    
    # 检查区间有效性
    if start > end:
        return s
    
    # 翻转指定区间
    words[start:end+1] = reversed(words[start:end+1])
    
    # 重组字符串
    return ' '.join(words)

# 主程序
if __name__ == "__main__":
    # 读取输入
    s = input().strip()
    start = int(input().strip())
    end = int(input().strip())
    
    # 处理并输出结果
    print(reverseWords(s, start, end))

算法原理解析

1. 字符串分割

words = s.split()
  • 使用split()方法按空格分割字符串
  • 自动处理连续空格情况
  • 生成单词列表(如['I', 'am', 'a', 'developer']

2. 边界处理逻辑

if start < 0:
    start = 0
if end >= n:
    end = n - 1
  • 起始下标处理:负数视为0(从第一个单词开始)
  • 结束下标处理:超过单词数视为最后一个单词下标
  • 有效性检查start > end时不执行翻转

3. 区间翻转实现

words[start:end+1] = reversed(words[start:end+1])
  • 切片操作words[start:end+1]获取子列表
  • reversed函数:反转子列表顺序
  • 原地赋值:直接修改原列表指定区间

4. 字符串重组

return ' '.join(words)
  • join()方法连接单词
  • 用单个空格分隔单词
  • 保持原字符串格式(首尾无多余空格)

示例解析

示例1:输入I am a developer.12

  1. 分割单词['I', 'am', 'a', 'developer.']
  2. 边界处理:start=1, end=2 (有效)
  3. 区间翻转:翻转索引1-2 → ['am','a']['a','am']
  4. 重组结果I a am developer.
  5. 输出I a am developer.

示例2:输入hello world-11

  1. 分割单词['hello', 'world']
  2. 边界处理
    • start=-1 → 0
    • end=1 (有效)
  3. 区间翻转:翻转索引0-1 → ['world','hello']
  4. 重组结果world hello
  5. 输出world hello

示例3:输入I am a developer05

  1. 分割单词['I', 'am', 'a', 'developer'] (n=4)
  2. 边界处理
    • start=0
    • end=5 → 3 (n-1)
  3. 区间翻转:翻转索引0-3 → ['developer','a','am','I']
  4. 重组结果developer a am I
  5. 输出developer a am I

示例4:输入I am a developer-2-1

  1. 分割单词['I', 'am', 'a', 'developer']
  2. 边界处理
    • start=-2 → 0
    • end=-1 → 3 (n-1)
  3. 有效性检查:0 > 3? 无效 → 不翻转
  4. 输出I am a developer

边界情况测试

测试1:空输入

输入:""00
处理:words=[] → n=0
边界:start=00? 保持0; end=00? 保持0
检查:0>0? 无效
输出:""

测试2:单个单词

输入:"Hello"00
处理:words=['Hello']、n=1
边界:start=0、end=0
翻转:['Hello']['Hello'](无变化)
输出:"Hello"

测试3:完全重叠区间

输入:"A B C D"12
处理:words=['A','B','C','D']
翻转:索引1-2['B','C']['C','B']
输出:"A C B D"

测试4:无效区间

输入:"Cat Dog"31
处理:start=3>n-1=1 → start=1; end=1
检查:1>1? 无效(start>end)
输出:"Cat Dog"

算法特点

时间复杂度分析

操作 时间复杂度 说明
字符串分割 O(n) n为字符串长度
边界处理 O(1) 常数时间操作
区间翻转 O(k) k为区间长度
字符串重组 O(m) m为单词总数
总计 O(n) 线性时间复杂度

空间复杂度

组件 空间复杂度 说明
单词列表 O(m) m为单词数量
翻转操作 O(k) k为区间长度
总计 O(n) 与输入规模相关

总结与扩展

关键知识点

  1. 字符串处理split()join()方法
  2. 边界处理:有效区间的判断与调整
  3. 列表操作:切片与反转
  4. 算法设计:分步骤处理复杂问题

实际应用场景

  1. 文本编辑器:实现选中文本的单词顺序翻转
  2. 自然语言处理:调整句子结构
  3. 代码重构工具:调整函数参数顺序
  4. 数据加密:通过单词重排实现简单加密

扩展思考

  1. 多语言支持:如何处理中文分词?

    import jieba
    words = jieba.lcut(s)
    
  2. 保留标点:如何在翻转时保留标点符号?

    # 使用正则表达式分割
    import re
    words = re.findall(r'\w+|[^\w\s]', s)
    
  3. 多区间翻转:支持多个不连续区间翻转

    # 定义多个(start,end)对
    for interval in intervals:
        start, end = interval
        # 执行翻转
    
  4. 撤销操作:如何实现翻转操作的撤销?

    # 保存操作历史
    history = []
    history.append((start, end))
    # 撤销时重新执行反向翻转
    

核心启示:清晰的问题分解和边界处理是解决算法问题的关键。本解法通过分步骤处理字符串分割、边界调整、区间翻转和结果重组,实现了高效可靠的单词翻转功能。

本解法适合初学者掌握:

  1. 字符串与列表的转换
  2. 边界条件的处理方法
  3. 列表切片和反转技巧
  4. 问题分解的思维方式

你可能感兴趣的:(华为OD机试Python版,华为od,python,算法)