You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

文本文件解析问题:寻找前四位不重复字符的标记索引失败

问题:查找文本中前四个字符无重复的标记字符索引

我需要解析一个文本文件,找到满足“前四个字符均不重复”的字符索引。例如字符串wxrgh中,h是标记字符,其索引为4——因为它的前四个字符wxrg均不重复。我将文本转为数组实现该逻辑,测试用例可正常运行,但实际输入无法得到正确结果。已尝试测试文档和单元测试,问题仍未解决。

相关代码如下:

重复判断函数

def Repeat(x):
    size = len(x)
    repeated = []
    for i in range(_size):
        k = i + 1
        for j in range(k, _size):
            if x[i] == x[j] and x[i] not in repeated:
                repeated.append(x[i])
    return repeated

主逻辑代码

with open("input4.txt") as f:
    text = f.read()
    test_array = []
    split_array = list(text)
    woah = ""
    for i in split_array:
        first = split_array[split_array.index(i)]
        second = split_array[split_array.index(i) + 1]
        third = split_array[split_array.index(i) + 2]
        fourth = split_array[split_array.index(i) + 3]
        test_array.append(first)
        test_array.append(second)
        test_array.append(third)
        test_array.append(fourth)
        print(test_array)
        if Repeat(test_array) != []:
            test_array = []
        else:
            woah = split_array.index(i)
        print(woah)

    print(woah)

代码问题分析

  1. Repeat函数变量错误:函数内定义了size = len(x),但循环使用的是未定义的_size,运行时会直接抛出NameError。同时该函数判断重复的逻辑冗余,效率低下。
  2. 循环逻辑错误:
    • 使用split_array.index(i)获取索引是致命问题:index()返回的是字符i在数组中第一次出现的位置,而非当前循环的位置。如果文本中有重复字符,后续循环会一直取第一个重复字符的索引,导致窗口位置完全错误。
    • 每次循环往test_array中追加四个字符,导致数组长度不断累积,最终检查的不是连续四个字符,而是所有追加的字符集合,逻辑完全偏离需求。
  3. 结果索引计算错误:根据需求,标记字符的索引应为“前四个字符窗口的起始索引+4”,原代码中直接赋值为起始索引,不符合示例逻辑。
  4. 变量类型错误:woah初始化为字符串类型,最终要存储数字索引,类型不匹配。

修正后的代码

def has_duplicates(chars):
    # 利用集合去重特性,长度相等则无重复字符
    return len(set(chars)) != len(chars)

with open("input4.txt") as f:
    text = f.read().strip()  # 去除文本首尾的空白/换行符
    char_list = list(text)
    result_index = -1

    # 遍历所有可能的窗口起始索引,确保窗口有4个字符
    for start_idx in range(len(char_list) - 3):
        # 获取当前窗口的4个连续字符
        current_window = char_list[start_idx:start_idx+4]
        if not has_duplicates(current_window):
            # 标记字符的索引为起始索引+4
            result_index = start_idx + 4
            break  # 找到第一个符合条件的结果就退出循环

    print(result_index)

修正说明

  • 替换冗余的重复判断逻辑,用集合实现高效的无重复检查。
  • 改用索引循环,直接操作字符数组的位置,避免index()方法的错误。
  • 每次取连续的4个字符作为检查窗口,符合需求逻辑。
  • 正确计算标记字符的索引,与示例规则一致。
  • 初始化结果为-1,未找到符合条件的字符时返回该值,逻辑更严谨。

内容的提问来源于stack exchange,提问作者RiyaNRocks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:45:31