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

编写检测重复字符的Pascal函数异常:匹配成功却返回False

问题分析与修复:Pascal RepeatedChar函数返回值异常

核心问题

你的函数逻辑存在致命缺陷:循环的每一次迭代都会强制覆盖返回值。即使中途已经匹配到目标字符并将返回值设为True,后续遇到不匹配的字符时,又会把返回值重新改为False。只有当目标字符恰好是字符串的最后一个字符时,最终返回值才会是正确的True——这就是测试案例2正常、测试案例1异常的原因。

看测试案例1的执行过程:第4次循环匹配到't'时,RepeatedChar被设为True,但第5次循环遇到'y'不匹配,又被设为False,最终函数返回False。

修复方案

初始化返回值为False,一旦找到匹配的字符,立即将返回值设为True并终止循环(无需继续遍历剩余字符),避免后续不匹配的字符覆盖正确结果。同时可以提前计算目标字符的ASCII值,减少重复计算。

修复后的代码:

function RepeatedChar(l: char; s: string): boolean;
var
  c, ordl, ords: integer;
begin
  RepeatedChar := False; // 初始化返回值为False
  ordl := ord(l); // 提前计算目标字符的ASCII值,无需循环内重复计算
  
  writeln(' LAUNCHED SEARCH FOR DUPLICATES ');
  writeln('________________________________');
  writeln('Searching for duplicates in: ', s);
  writeln('char: ', l);
  writeln('length: ', length(s));
  
  for c := 1 to length(s) do
  begin
    writeln(ord(s[c]));
    ords := ord(s[c]);
    writeln('MATCHING: ', ordl, ' with ', ords);
    
    if ordl = ords then
    begin
      RepeatedChar := True;
      break; // 找到匹配后立即终止循环,避免后续覆盖
    end;
  end;
  
  writeln('________________________________');
  writeln(' ALL DONE ');
end;

修复逻辑说明

  1. 初始时默认返回False,符合"未找到匹配则返回False"的预期;
  2. 遍历字符串过程中,一旦找到匹配的字符,立即将返回值设为True并跳出循环,确保后续字符不会修改已经正确的返回值;
  3. 提前计算ord(l),避免每次循环重复执行相同计算,提升代码效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:03:31