给定一个字符串,"xyz"是否出现在字符串的中间?

 mobiledu2502875063 发布于 2023-02-12 17:09

我想我记得这个问题 - 我相信这是来自Codingbat的这个问题.优秀的网站,当我开始编程时,从该网站学到了很多东西.但是,绝对没有理由使用循环.

public boolean xyzMiddle(String str) {
  boolean result = false; 
  int i = str.length()/2 -1;

  if (str.length() >= 3 && (str.substring(i, i+3).equals("xyz") || (str.length()%2 == 0 && str.substring(i-1, i+2).equals("xyz"))  )) {
      result = true;
  }
  return result;
}

那么,让我们来看看这个以及它为何起作用.首先,str.length() >= 3因为如果字符串不至少与"xyz"一样长,那么它就无法包含"xyz".

这个问题有两个主要案例,我们需要考虑.弦可以具有均匀或不均匀的长度.在不平衡的情况下,很容易:

不平衡的情况

AAAxyzAAA // length = 9
012345678 // the indexes
    ^     // that's the middle, which can be calculated by length/2
          // (since this is an integer divison, we disregard whatever comes after the decimal point)

因此,为了获得xyz-substring的开头,我们只需从这个数字中减去一个 - 这正是i在做什么:

AAAxyzAAA // length = 9
012345678 // the indexes
   i      // i = length/2-1 = 3

如果str.substring(i, i+3)是的话xyz,我们可以回归真实!

Even Case 现在,这可能有点棘手,因为字符串没有真正的"中间".实际上,两个索引可以称为中间,因此我们有两个子案例:

AAAAAAAA // length = 8
01234567 // the indexes
   ^^    // Which one is the true middle character?

实际上,中间位于索引3和4之间.但是,我们执行整数除法,长度/ 2始终是两个可能的"中间"中最大的(最右边).而且由于我们i使用中间值计算,与不均匀情况相同 - str.substring(i, i+3)可以认为是字符串的中间部分.

AAAxyzAA 
01234567 
   ^^^     // str.substring(i, i+3)
   i

但是,假设我们的字符串是AAxyzAAA-这可能被认为是字符串的中间部分.所以我们需要将子字符串检查"向左移动" - 所以我们从中减去1.

AAxyzAAA 
01234567 
  ^^^      // str.substring(i-1, i+2)
   i       // i is still at "the old" location

它是偶数还是不是?

要检查字符串是偶数还是不均匀,我们使用运算符%.想到它的作用的最简单方法是"在用这个数字划分后会留下什么?".所以3 % 2将是1.在我们的情况下,我们希望确保数字可以被2整除而没有遗留任何东西 - 因为这意味着它是偶数.因此,str.length() % 2 == 0在进行"向左移动" 检查之前,我们需要检查一下.如果没有,我们可能冒险超出字符串的界限.如果字符串是3个字符长,我们向左移动一个...我们将检查从索引-1开始的子字符串,这没有多大意义.

把它们放在一起,然后你去!

1 个回答
  • 我想我记得这个问题 - 我相信这是来自Codingbat的这个问题.优秀的网站,当我开始编程时,从该网站学到了很多东西.但是,绝对没有理由使用循环.

    public boolean xyzMiddle(String str) {
      boolean result = false; 
      int i = str.length()/2 -1;
    
      if (str.length() >= 3 && (str.substring(i, i+3).equals("xyz") || (str.length()%2 == 0 && str.substring(i-1, i+2).equals("xyz"))  )) {
          result = true;
      }
      return result;
    }
    

    那么,让我们来看看这个以及它为何起作用.首先,str.length() >= 3因为如果字符串不至少与"xyz"一样长,那么它就无法包含"xyz".

    这个问题有两个主要案例,我们需要考虑.弦可以具有均匀或不均匀的长度.在不平衡的情况下,很容易:

    不平衡的情况

    AAAxyzAAA // length = 9
    012345678 // the indexes
        ^     // that's the middle, which can be calculated by length/2
              // (since this is an integer divison, we disregard whatever comes after the decimal point)
    

    因此,为了获得xyz-substring的开头,我们只需从这个数字中减去一个 - 这正是i在做什么:

    AAAxyzAAA // length = 9
    012345678 // the indexes
       i      // i = length/2-1 = 3
    

    如果str.substring(i, i+3)是的话xyz,我们可以回归真实!

    Even Case 现在,这可能有点棘手,因为字符串没有真正的"中间".实际上,两个索引可以称为中间,因此我们有两个子案例:

    AAAAAAAA // length = 8
    01234567 // the indexes
       ^^    // Which one is the true middle character?
    

    实际上,中间位于索引3和4之间.但是,我们执行整数除法,长度/ 2始终是两个可能的"中间"中最大的(最右边).而且由于我们i使用中间值计算,与不均匀情况相同 - str.substring(i, i+3)可以认为是字符串的中间部分.

    AAAxyzAA 
    01234567 
       ^^^     // str.substring(i, i+3)
       i
    

    但是,假设我们的字符串是AAxyzAAA-这可能被认为是字符串的中间部分.所以我们需要将子字符串检查"向左移动" - 所以我们从中减去1.

    AAxyzAAA 
    01234567 
      ^^^      // str.substring(i-1, i+2)
       i       // i is still at "the old" location
    

    它是偶数还是不是?

    要检查字符串是偶数还是不均匀,我们使用运算符%.想到它的作用的最简单方法是"在用这个数字划分后会留下什么?".所以3 % 2将是1.在我们的情况下,我们希望确保数字可以被2整除而没有遗留任何东西 - 因为这意味着它是偶数.因此,str.length() % 2 == 0在进行"向左移动" 检查之前,我们需要检查一下.如果没有,我们可能冒险超出字符串的界限.如果字符串是3个字符长,我们向左移动一个...我们将检查从索引-1开始的子字符串,这没有多大意义.

    把它们放在一起,然后你去!

    2023-02-12 17:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有