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

字符串X位置匹配代码故障排查:EqualX方法为何无法正确识别X?

字符串X位置一致性判断的代码错误分析与修复

问题描述

练习要求实现X位置识别功能:字符串A中所有存在X的位置,字符串B在相同位置必须也有X;反之,B中存在X的位置,A也必须有X。但当前代码无法正确识别这种情况,测试用例"XaXaXaX"和"XeXwXeX"(二者X位置完全对应)本应返回相等,却返回了不相等,需要找出代码中的错误并修复。

原代码

public class Excersize4 {
  
  public static boolean EqualX ( String strA, String strB )  {
    if ( strA.isEmpty() && strB.isEmpty()) {
      return true;  
    }
      
      else if ( strA.isEmpty() && !strB.isEmpty()) {
      if (strB.charAt(0) != 'X')
        return EqualX(strA,strB.substring(1));
      else 
        return false;
    }
      
    else if (strB.isEmpty() && !strA.isEmpty()) {
      if (strA.charAt(0) != 'X')
        return EqualX(strA.substring(1), strB);
      else 
        return false;
    }
      
    else {
      if (strA.charAt(0) == 'X' && strB.charAt(0) == 'X')
        return EqualX(strA.substring(1),strB.substring(1));
      else if (strA.charAt(0) == 'X' || strB.charAt(0) != 'X')
        return false;

      else if (strA.charAt(0) != 'X' || strB.charAt(0) != 'X')
        return EqualX (strA.substring(1), strB.substring(1));
      
      else
        return true;
    }
  }
  
  public static void main (String[] args)  {
    String strA = "XaXaXaX";    
    String strB = "XeXwXeX";
    
     if ( EqualX( strA, strB ) )
      System.out.println(  "\"" + strA + "\" == \"" + strB  + "\"" );
    else
      System.out.println(  "\"" + strA + "\" != \"" + strB  + "\"" );
  }
}

错误分析

核心错误出现在else分支的条件判断逻辑:

  1. 第二个else if条件逻辑错误:strA.charAt(0) == 'X' || strB.charAt(0) != 'X'这个条件几乎总是成立(比如当A当前字符为非X、B当前字符也为非X时,strB.charAt(0) != 'X'为true,整个条件触发),导致合法的非X字符位置直接被判定为不相等,这是测试用例返回错误结果的根本原因。
  2. 第三个else if条件逻辑错误:strA.charAt(0) != 'X' || strB.charAt(0) != 'X'使用了逻辑或,会覆盖错误情况(比如A是X而B不是时,这个条件也会成立),应该改为逻辑与,仅当两者当前字符都不是X时才递归处理剩余字符串。

修复后的代码

public class Excersize4 {
  
  public static boolean EqualX ( String strA, String strB )  {
    if ( strA.isEmpty() && strB.isEmpty()) {
      return true;  
    }
      
    else if ( strA.isEmpty() && !strB.isEmpty()) {
      // A为空时,B剩余字符不能包含X
      if (strB.charAt(0) != 'X')
        return EqualX(strA, strB.substring(1));
      else 
        return false;
    }
      
    else if (strB.isEmpty() && !strA.isEmpty()) {
      // B为空时,A剩余字符不能包含X
      if (strA.charAt(0) != 'X')
        return EqualX(strA.substring(1), strB);
      else 
        return false;
    }
      
    else {
      if (strA.charAt(0) == 'X' && strB.charAt(0) == 'X') {
        // 两者当前都是X,递归处理剩余部分
        return EqualX(strA.substring(1), strB.substring(1));
      } else if ((strA.charAt(0) == 'X' && strB.charAt(0) != 'X') || 
                 (strB.charAt(0) == 'X' && strA.charAt(0) != 'X')) {
        // 一方是X另一方不是,直接返回false
        return false;
      } else {
        // 两者都不是X,递归处理剩余部分
        return EqualX(strA.substring(1), strB.substring(1));
      }
    }
  }
  
  public static void main (String[] args)  {
    String strA = "XaXaXaX";    
    String strB = "XeXwXeX";
    
    if ( EqualX( strA, strB ) )
      System.out.println(  "\"" + strA + "\" == \"" + strB  + "\"" );
    else
      System.out.println(  "\"" + strA + "\" != \"" + strB  + "\"" );
  }
}

修复说明

  • 明确了X位置必须完全对应的判断逻辑:仅当一方为X另一方不为X时返回false
  • 修正了递归条件:仅当两者当前字符都不是X时,才递归处理剩余字符串
  • 保留了边界条件的正确性:当其中一个字符串为空时,另一个字符串的剩余部分不能包含任何X

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:05:32