在包含五个或五个以上字母的单词中,颠倒字符的顺序



我是Java新手,还在学习。作为学习的一部分,我接受了一个挑战,编写了一个程序,该程序将使用一个字符串,并检查是否有长度为5或5以上的单词,如果有,它将翻转5个以上长单词中的字符。挑战是在不使用Collections.reverse(list(或StringBuilder的情况下完成。

我的想法是,我想说简单地写两个方法。Main将拆分字符串,并通过每个字符串数组索引进行迭代,寻找5个以上的长单词,并且在"if"条件内触发名为"reverse"的方法。看起来这个还可以。对于反向方法,其思想是将单词拆分为一个数组,然后在2个嵌套的"For"循环的帮助下,通过"ori"和辅助"rev"数组的索引进行迭代,将索引ori[i]的值分配给索引rev[j]。

因此从i=0和j=arr.length-1开始;s";ori[0]至rev[7]中的句外单词,然后";e";从ori[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和许多其他的,大多是盲目的拍摄,在我的逻辑失败的地方寻找灵感。

Hy 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()创建数组
  • 遍历数组的一半,只需交换向内移动的结束字符
  • 那么,由于String构造函数将一个字符数组作为参数,因此返回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);
}

请注意,对于偶数长度的字符串,中间的两个字符是交换的。对于奇数长度的字符串,中间字符不受影响。

最新更新