在保持顺序和空格数的同时反向打印单词?
Reverse printing words while maintaining order and number of spaces?
我正在尝试解决 this problem 但我不确定为什么我的解决方案不起作用。我的调试尝试告诉我,该解决方案正在尝试访问某些数据结构边界之外的索引,但这对我来说没有意义,因为我的 for 循环测试似乎会这样做。
除此之外,此解决方案可能还有许多其他问题。
我也 90% 确定有一种更有效的方法可以做到这一点。你能帮我看看我哪里做错了吗?
如果有更高效的解决方案,会是什么?我正在努力以有效的方式以相同的顺序跟踪相同数量的空格。
如果需要更多信息,请告诉我,我会更新。
public static void printReversed(String line){
Scanner console = new Scanner(line);
ArrayList<String> list = new ArrayList<String>(); // keeps track of words in line
int spaceOccur = 0; // keeps track of the number of times there are spaces
while (console.hasNext()){
list.add(console.next());
spaceOccur++;
}
int[] spaces = new int[spaceOccur]; // keeps track of number of spaces for each occurrence of spaces
int count = 0; // for spaces[] traversal
// searches through original input to get number of spaces
for (int i = 0; i < line.length() - 1; i++){
if (line.charAt(i) == ' '){
int j = i;
int num = 0;
// traversal through spaces to count how many
while (line.charAt(j) == (' ')){ // first error here
num++;
j++;
}
i = j; // updates for loop counter to point past spaces
spaces[count] = num; // saves number of spaces
count++;
}
}
// printing reversed input
for (int k = 0; k < list.size(); k++){
// prints reversed chars
for (int m = list.get(k).length(); m > 0; m++){
System.out.print(list.get(k).charAt(m));
}
// prints spaces
for (int n = 0; n < spaces[k]; n++){
System.out.print(" ");
}
}
}
我会说你走对了路,但有些地方需要仔细检查。第一个循环似乎有一些问题:j++
可能超出了数组的边界——至少如果你的字符串末尾有 spaces。整个循环本身似乎忽略了该行的最后一个字符。
你确定你需要第一个循环吗?如果我没理解错的话,Scanner
的 next()
会给你 space 之间的字符串;在连续两个 space 的情况下,我认为它应该 return 你一个空字符串。在这种情况下,您可以按照函数末尾的方式循环列表,并在列表中遇到空字符串时打印 space 字符。否则只需向后打印单词,就像你已经做的一样(除了它应该是 m--
而不是最后一个 for 循环中的 m++
)。
但是如果 Scanner
在有两个或多个连续的 space 字符时不会给你空字符串,我敢打赌字符串的 split()
方法应该有效。
我正在尝试解决 this problem 但我不确定为什么我的解决方案不起作用。我的调试尝试告诉我,该解决方案正在尝试访问某些数据结构边界之外的索引,但这对我来说没有意义,因为我的 for 循环测试似乎会这样做。
除此之外,此解决方案可能还有许多其他问题。
我也 90% 确定有一种更有效的方法可以做到这一点。你能帮我看看我哪里做错了吗?
如果有更高效的解决方案,会是什么?我正在努力以有效的方式以相同的顺序跟踪相同数量的空格。
如果需要更多信息,请告诉我,我会更新。
public static void printReversed(String line){
Scanner console = new Scanner(line);
ArrayList<String> list = new ArrayList<String>(); // keeps track of words in line
int spaceOccur = 0; // keeps track of the number of times there are spaces
while (console.hasNext()){
list.add(console.next());
spaceOccur++;
}
int[] spaces = new int[spaceOccur]; // keeps track of number of spaces for each occurrence of spaces
int count = 0; // for spaces[] traversal
// searches through original input to get number of spaces
for (int i = 0; i < line.length() - 1; i++){
if (line.charAt(i) == ' '){
int j = i;
int num = 0;
// traversal through spaces to count how many
while (line.charAt(j) == (' ')){ // first error here
num++;
j++;
}
i = j; // updates for loop counter to point past spaces
spaces[count] = num; // saves number of spaces
count++;
}
}
// printing reversed input
for (int k = 0; k < list.size(); k++){
// prints reversed chars
for (int m = list.get(k).length(); m > 0; m++){
System.out.print(list.get(k).charAt(m));
}
// prints spaces
for (int n = 0; n < spaces[k]; n++){
System.out.print(" ");
}
}
}
我会说你走对了路,但有些地方需要仔细检查。第一个循环似乎有一些问题:j++
可能超出了数组的边界——至少如果你的字符串末尾有 spaces。整个循环本身似乎忽略了该行的最后一个字符。
你确定你需要第一个循环吗?如果我没理解错的话,Scanner
的 next()
会给你 space 之间的字符串;在连续两个 space 的情况下,我认为它应该 return 你一个空字符串。在这种情况下,您可以按照函数末尾的方式循环列表,并在列表中遇到空字符串时打印 space 字符。否则只需向后打印单词,就像你已经做的一样(除了它应该是 m--
而不是最后一个 for 循环中的 m++
)。
但是如果 Scanner
在有两个或多个连续的 space 字符时不会给你空字符串,我敢打赌字符串的 split()
方法应该有效。