Java 使用递归查找';嗨';在字符串中,但不是';xhi';
我正在做一个来自codingbat的问题,我被困在这个问题上。问题要求我在字符串中查找所有的Java 使用递归查找';嗨';在字符串中,但不是';xhi';,java,recursion,Java,Recursion,我正在做一个来自codingbat的问题,我被困在这个问题上。问题要求我在字符串中查找所有的'hi',但忽略前面有'x'的'hi'。换句话说,不要计算'xhi',而只计算'hi' 在我的代码中,除了输入为“xxxx”时,每个输入都可以正常工作。 我的代码如下: public int countHi2(String str) { String s = "hi"; int count = 0; if(str.length() < 2) {
'hi'
,但忽略前面有'x'
的'hi'
。换句话说,不要计算'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;
}
public int countHi2(字符串str){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果(str.charAt(0)='x'&&str.substring(1,3).等于(s)){
count+=countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+=1+countHi2(str.substring(2));
}
否则{
count+=countHi2(str.substring(1));
}
返回计数;
}
问题是它抛出IndexOutOfBoundsException。可以找到问题的链接。问题是,如果字符串末尾(或最后两个位置之一)有一个“x”,则子字符串将从超出范围的索引开始(如异常所示)。如果
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;
}
问题是,如果字符串末尾(或最后2个位置之一)有一个“x”,则子字符串将从超出范围的索引开始(如异常所示)。如果
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;
}
您会看到异常,因为您检查长度是否至少为2,然后执行子字符串(1,3),从而导致异常
通过切换到
startsWith
API,可以避免IndexOutOfBoundsException
中的indexoutboundsexception
问题,该API即使在将字符串与较长字符串进行比较时也不会引发异常。您会看到异常,因为您检查长度至少为2,然后执行子字符串(1,3)
,导致异常的
通过切换到
startsWith
API,可以避免substring
中的IndexOutOfBoundsException
问题,该API即使将字符串与较长的字符串进行比较,也不会引发异常。您永远不会到达此行
return count;
您一直在使用if-else
当您的输入为“xxxx”时,您将继续访问
count+= countHi2(str.substring(1));
你永远也到不了这条线
return count;
您一直在使用if-else
当您的输入为“xxxx”时,您将继续访问
count+= countHi2(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;
}
}
(它不处理空值,实际上也没有经过优化。)您可以执行以下操作:
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;
}
}
(它不处理空值,而且实际上没有经过优化。)第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(字符串str){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果(str.length()>=3&&str.charAt(0)='x'&&str.substring(1,3).equals){
count+=countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+=1+countHi2(str.substring(2));
}
否则{
count+=countHi2(str.substring(1));
}
返回计数;
}
第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(字符串str){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果(str.length()>=3&&str.charAt(0)='x'&&str.substring(1,3).equals){
count+=countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+=1+countHi2(str.substring(2));
}
否则{
count+=countHi2(str.substring(1));
}
返回计数;
}
修复了一个
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;
}
public int countHi2(字符串str){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果(str.charAt(0)='x'&&str.length()>2&&str.substring(1,3).equals){
count+=countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+=1+countHi2(str.substring(2));
}
否则{
count+=countHi2(str.substring(1));
}
返回计数;
}
修复了一个
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;
}
public int countHi2(字符串str){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果(str.charAt(0)='x'&&str.length()>2&&str.substring(1,3).equals){
count+=countHi2(str.substring(3));
}
else if(str.substring(0,2).equals(s)){
count+=1+countHi2(str.substring(2));
}
否则{
count+=countHi2(str.substring(1));
}
返回计数;
}
此代码适用于“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;
}
publicstaticintcounthi2(stringstr){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果((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));
}
否则{
count+=countHi2(str.substring(1));
}
返回计数;
}
此代码适用于“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;
}
publicstaticintcounthi2(stringstr){
字符串s=“hi”;
整数计数=0;
如果(str.length()<2){
返回0;
}
else如果((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));
}