我想我记得这个问题 - 我相信这是来自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开始的子字符串,这没有多大意义.
把它们放在一起,然后你去!
我想我记得这个问题 - 我相信这是来自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开始的子字符串,这没有多大意义.
把它们放在一起,然后你去!