这里有一个问题,从用户那里得到一个字符串输入,然后反转字符串。
例如:输入:"我爱冰淇淋!”输出:“奶油!冰爱我”
下面是源代码:
import java.util.*;
public class stringProblems {
static void reverse(char str[], int start, int end){
char temp;
while(start <= end){
temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
static char[] reverseWords(char[] s){
int start = 0;
for(int end = 0; end < s.length; end++){
if(s[end] == ' '){
reverse(s, start, end);
start = end + 1;
}
}
reverse(s, start, s.length -1);
reverse(s, 0, s.length-1);
return s;
}
public static void main(String[] args) {
System.out.println("enter the string to be reversed");
Scanner ss = new Scanner(System.in);
String s = ss.nextLine();
char[] p = reverseWords(s.toCharArray());
System.out.println(p);
}
}
我怀疑的是reverseWords方法中的for循环会迭代,直到它找到一个空的空间。我给出的输入是“我喜欢冰淇淋!因此,在第二次迭代中,if(s [end]=='')语句中的条件变为true,并调用反向方法。reverse方法中的while(start <= end)循环在第一次迭代时,start的值为0,end的值为1。在结束时,由于start ++,start的值递增到1,end的值递减到0; and end--;在下一次迭代中条件失败,它跳转到for(int end = 0; end <= s. length; end ++)在reverseWords方法中循环,现在end的值从0或2开始,因为它是1,因为“I love ice cream!"?
提示:看懂上面的源代码就能明白我的问题。
3条答案
按热度按时间sy5wg1nm1#
如果我理解正确的话(最后一段有点冗长),你问的是在两个不同的方法中有
start
和end
变量相互调用,以及这如何影响这些值。简短的回答是,它们根本不会相互影响。在一个函数中声明的变量与另一个函数中同名的变量完全无关,这包括函数参数。
在
reverse
中对end
所做的更改对reverseWords
不可见。您可以在reverse(s, start, end);
之前和之后打印end
,您将看到相同的值。如果end
之前是1,那么之后就是1。请注意,当你有容器和对象时,对这些容器和对象内部的值所做的更改将对所有人可见。这是因为变量本身就是一个引用,如果你把这个引用交给另一个函数,它们都会指向同一个底层数据结构。
至于你的bug,问题是
reverse
交换了start
和end
之间的所有字母,也就是说,它交换了s[start] <-> s[end]
,然后交换了s[start+1] <-> s[end-1]
,等等。这是一个问题,因为reverseWords
在s[end] == ' '
时调用它,所以第一个字母将与空格交换,而不是最后一个字母。要修复它,只需调用
reverse
,并将末尾向后移动一点:ruarlubt2#
有很多事情要解释。
通过将相关值打印到标准输出,可以更容易地可视化数据流。
我已经实现了一些输出,从单独的方法中。
输出量
9avjhtql3#
//修改“reverseWords”的方法,如下所示
//尝试以下操作来反转单词顺序