使用递归来查找字符串中的“hi”数而不是“xhi”
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用递归来查找字符串中的“hi”数而不是“xhi”相关的知识,希望对你有一定的参考价值。
我正在使用codingbat做一个问题而且我遇到了这个问题。这个问题要求我找到字符串中的所有'hi'
,但忽略在它们之前有'hi'
的'x'
。换句话说,不要计算'xhi'
而只计算'hi'
。
除了输入为"xxxx"
时,每个输入在我的代码中都能正常工作。我的代码如下:
public int countHi2(String str) {
String s = "hi";
int count = 0;
if(str.length() < 2) {
return 0;
}
else if(str.charAt(0) == 'x' && str.substring(1,3).equals(s)) {
count+= countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+= 1 + countHi2(str.substring(2));
}
else {
count+= countHi2(str.substring(1));
}
return count;
}
问题是它抛出IndexOutOfBoundsException。问题的链接可以找到here。
你看到一个异常,因为substring
throws IndexOutOfBoundsException
if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.你检查长度至少为2,然后做substring(1, 3)
,导致异常。
您可以通过切换到IndexOutOfBoundsException
API来避免substring
中startsWith
的问题,即使您将字符串与较长的字符串进行比较也不会抛出异常。
如果您不必使用递归:
public int countHi(String test) {
if (test == null){
return 0;
}
test = test.replaceAll("xhi", "");
int n1 = test.length();
int n2 = test.replaceAll("hi", "").length();
return (n1-n2)/2;
}
下面是获取特定字符串中“hi”计数的代码。
public int countHi(String str) {
int count = 0;
int len = str.length();
if(len<2) {
return 0;
}
else {
if(str.substring(0,2).equals("hi")) {
return count+1+countHi(str.substring(2));
}
else {
return count+countHi(str.substring(1));
}
}
}
你可以这样做:
public static int countHi2(String str) {
if (str.startsWith("xhi")) {
return countHi2(str.substring(3));
} else if (str.startsWith("hi")) {
return countHi2(str.substring(2)) + 1;
} else if (str.length() > 0){
return countHi2(str.substring(1));
} else {
return 0;
}
}
(它不处理空值,它实际上没有优化。)
问题是如果你的字符串末尾有一个'x'(或者最后2个位置之一),你的子字符串将从一个超出范围的索引开始(正如你的异常所告诉你的那样)。如果str.substring(3)
可行,您可以检查一下这种情况:
else if(str.charAt(0) == 'x' && str.substring(1,3).equals(s)) {
if (str.length() > 3) count+= countHi2(str.substring(3));
else return count;
}
第8行需要修改。
else if(str.length()>=3 && str.charAt(0) == 'x' && str.substring(1,3).equals(s))
{...}
总代码应为 -
public int countHi2(String str) {
String s = "hi";
int count = 0;
if(str.length() < 2) {
return 0;
}
else if(str.length()>=3 && str.charAt(0) == 'x' && str.substring(1,3).equals(s)) {
count+= countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+= 1 + countHi2(str.substring(2));
}
else {
count+= countHi2(str.substring(1));
}
return count;
}
固定一个
public int countHi2(String str) {
String s = "hi";
int count = 0;
if(str.length() < 2) {
return 0;
}
else if(str.charAt(0) == 'x' && str.length() > 2 && str.substring(1,3).equals(s)) {
count+= countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+= 1 + countHi2(str.substring(2));
}
else {
count+= countHi2(str.substring(1));
}
return count;
}
此代码将很好地用于'XXXX'和其他组合。但我没有检查所有组合。
public static int countHi2(String str) {
String s = "hi";
int count = 0;
if(str.length() < 2) {
return 0;
}
else if((str.length() >= 3) && (str.charAt(0) == 'x' && str.substring(1,3).equals(s))) {
count+= countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+= 1 + countHi2(str.substring(2));
}
else {
count+= countHi2(str.substring(1));
}
return count;
}
你永远不会到达这条线
return count;
如果您的输入是“xxxx”,您一直在使用if else
count+= countHi2(str.substring(1));
如果你有2个字母仍然是“xx”并且你检查了第一个条件,那么当你得到那个错误时你会做str.substring(1,3)
。在这种情况下,您应该检查str.lenght()
不是2,例如:
public int countHi2(String str) {
String s = "hi";
int count = 0;
if(str.length() < 2) {
return 0;
}
else if(str.length()>2 && str.charAt(0) == 'x' && str.substring(1,3).equals(s)) {
count+= countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+= 1 + countHi2(str.substring(2));
}
else {
count+= countHi2(str.substring(1));
}
return count;
}
你们很复杂。这是一个简单的解决方案。
public int countHi2(String str) {
return (str.length() < 2)?0:
(str.substring(0,2).equals("xh"))?
countHi2(str.substring(2)):
(str.substring(0,2).equals("hi"))?
1 + countHi2(str.substring(1)):
countHi2(str.substring(1));
}
或者看起来太奇怪了:
public int countHi2(String str) {
if(str.length() < 2)
return 0;
else if(str.substring(0,2).equals("xh"))
return countHi2(str.substring(2));
else (str.substring(0,2).equals("hi"))
return 1 + countHi2(str.substring(1));
else return countHi2(str.substring(1));
}
以上是关于使用递归来查找字符串中的“hi”数而不是“xhi”的主要内容,如果未能解决你的问题,请参考以下文章