颠倒五个字母或更多字母的单词中的字符顺序
Reverse the order of characters within words with five letters or more
我是 Java 的新手,我还在学习中。作为我学习的一部分,我接受了一个挑战,编写了一个程序,该程序将接受一个字符串,并检查是否有任何长度为 5 或更多的单词,如果有,它将翻转 5+ 长单词中的字符.挑战在于不使用 Collections.reverse(list) 或 StringBuilder.
我的想法是,编写 2 个方法很简单。
Main 将拆分字符串,并通过每个字符串数组索引进行迭代以查找 5+ 长单词,并且将在 'if' 条件内触发名为 'reverse' 的方法。看起来这个工作正常。
对于反向方法,想法是将单词拆分为一个数组,然后借助 2 个嵌套 'for' 循环遍历 'ori' 和辅助 'rev' 数组的索引以分配索引 ori 的值[i] 索引 rev[j].
所以从 i=0 和 j=arr.length-1 开始将导致从 ori[0] 到 rev[7] 的句子单词中分配值“s”,然后从 ori 中分配值“e” [1] 到 rev[6],依此类推,所以结果将是 [e, c, n, e, t, n, e, s]
相反,我得到这样的输出:
[This, [e, e, e, e, e, e, e, e], will, [n, n, n, n, n, n, n], [s, s, s, s, s], with, more, than, five, [., ., ., ., ., ., ., .]]
我尝试了很多方法来解决问题,但到目前为止我的逻辑都失败了。有人可以解释一下吗,我做错了什么,我怎么搞砸了这个看似简单的逻辑?
稍后我会弄清楚如何将其显示为不带方括号和逗号的常规句子,所以到目前为止这不是问题。
代码:
import java.util.Arrays;
public class Main {
public static void main (String[] args) {
String original = "This sentence will contain words with more than five letters.";
String[] splitter = original.split(" ");
for (int i = 0; i < splitter.length; i++){
if (splitter[i].length() >= 5){
splitter[i] = reverse(splitter[i]);
}
}
System.out.println(Arrays.toString(splitter));
}
public static String reverse (String s){
String [] ori = s.split("");
String [] rev = new String[ori.length];
for (int i = 0; i < rev.length; i++) {
for (int j = rev.length-1; j >=0; j--) {
rev[j] = ori[i];
}
}
s = Arrays.toString(rev);
return s;
}
}
新手请谅解:)
我尝试修改这部分:
public static String reverse (String s){
String [] ori = s.split("");
String [] rev = new String[ori.length];
for (int i = 0; i < rev.length; i++) {
for (int j = rev.length-1; j >=0; j--) {
rev[j] = ori[i];
通过交换 i/j、rev[i] = ori[j]、--j、j > 0 和许多其他方法,主要是盲目的寻找我的逻辑失败的灵感。
您好 Pawel Niewolak,问题出在您的反向功能上。
根据您的要求使用:
public static String reverse(String s) {
String[] ori = s.split("");
String[] rev = new String[ori.length];
for (int i = 0; i < rev.length; i++) {
rev[i] = ori[rev.length - i - 1];
}
s = "";
for (String str : rev) {
s += str;
}
return s;
}
}
这是另一种使用现有字符数组的可能性。
- 使用
String.toCharArray()
创建数组
- 遍历数组half-way,简单地交换结束字符向内移动。
- 然后由于 String 构造函数将字符数组作为参数,return
new String(array)
public static String reverse(String s) {
char[] array = s.toCharArray();
for (int i = 0; i <array.length/2; i++) {
char ch = array[i];
array[i] = array[array.length-i-1];
array[array.length-i-1] = ch;
}
return new String(array);
}
请注意,对于偶数长度的字符串,中间的两个字符会被交换。对于奇数长度的字符串,中间字符保持不变。
我是 Java 的新手,我还在学习中。作为我学习的一部分,我接受了一个挑战,编写了一个程序,该程序将接受一个字符串,并检查是否有任何长度为 5 或更多的单词,如果有,它将翻转 5+ 长单词中的字符.挑战在于不使用 Collections.reverse(list) 或 StringBuilder.
我的想法是,编写 2 个方法很简单。 Main 将拆分字符串,并通过每个字符串数组索引进行迭代以查找 5+ 长单词,并且将在 'if' 条件内触发名为 'reverse' 的方法。看起来这个工作正常。 对于反向方法,想法是将单词拆分为一个数组,然后借助 2 个嵌套 'for' 循环遍历 'ori' 和辅助 'rev' 数组的索引以分配索引 ori 的值[i] 索引 rev[j].
所以从 i=0 和 j=arr.length-1 开始将导致从 ori[0] 到 rev[7] 的句子单词中分配值“s”,然后从 ori 中分配值“e” [1] 到 rev[6],依此类推,所以结果将是 [e, c, n, e, t, n, e, s]
相反,我得到这样的输出:
[This, [e, e, e, e, e, e, e, e], will, [n, n, n, n, n, n, n], [s, s, s, s, s], with, more, than, five, [., ., ., ., ., ., ., .]]
我尝试了很多方法来解决问题,但到目前为止我的逻辑都失败了。有人可以解释一下吗,我做错了什么,我怎么搞砸了这个看似简单的逻辑?
稍后我会弄清楚如何将其显示为不带方括号和逗号的常规句子,所以到目前为止这不是问题。
代码:
import java.util.Arrays;
public class Main {
public static void main (String[] args) {
String original = "This sentence will contain words with more than five letters.";
String[] splitter = original.split(" ");
for (int i = 0; i < splitter.length; i++){
if (splitter[i].length() >= 5){
splitter[i] = reverse(splitter[i]);
}
}
System.out.println(Arrays.toString(splitter));
}
public static String reverse (String s){
String [] ori = s.split("");
String [] rev = new String[ori.length];
for (int i = 0; i < rev.length; i++) {
for (int j = rev.length-1; j >=0; j--) {
rev[j] = ori[i];
}
}
s = Arrays.toString(rev);
return s;
}
}
新手请谅解:)
我尝试修改这部分:
public static String reverse (String s){
String [] ori = s.split("");
String [] rev = new String[ori.length];
for (int i = 0; i < rev.length; i++) {
for (int j = rev.length-1; j >=0; j--) {
rev[j] = ori[i];
通过交换 i/j、rev[i] = ori[j]、--j、j > 0 和许多其他方法,主要是盲目的寻找我的逻辑失败的灵感。
您好 Pawel Niewolak,问题出在您的反向功能上。
根据您的要求使用:
public static String reverse(String s) {
String[] ori = s.split("");
String[] rev = new String[ori.length];
for (int i = 0; i < rev.length; i++) {
rev[i] = ori[rev.length - i - 1];
}
s = "";
for (String str : rev) {
s += str;
}
return s;
}
}
这是另一种使用现有字符数组的可能性。
- 使用
String.toCharArray()
创建数组
- 遍历数组half-way,简单地交换结束字符向内移动。
- 然后由于 String 构造函数将字符数组作为参数,return
new String(array)
public static String reverse(String s) {
char[] array = s.toCharArray();
for (int i = 0; i <array.length/2; i++) {
char ch = array[i];
array[i] = array[array.length-i-1];
array[array.length-i-1] = ch;
}
return new String(array);
}
请注意,对于偶数长度的字符串,中间的两个字符会被交换。对于奇数长度的字符串,中间字符保持不变。