我知道如何反转字符串,但我只是尝试使用字符数组的另一种方法。告诉我为什么输出错误? a有String
char[] c = a.toCharArray();
int j = c.length;
char c2[] = c;
for(int i = 0; i < j; i++){
c2[i] = c[j - i - 1];
}
System.out.println(c2);
喜欢给哈罗德提供输出dloold
答案 0 :(得分:2)
没有必要使用两个数组,当你做一个引用副本时,你最终还是会在同一个数组上工作。
请记住使用空数组,null,具有偶数长度和奇数长度的数组来测试算法。
这是一个包含简单测试打印的单一阵列解决方案。
public class ReverseTest {
public static String reverse(String s) {
if (s == null)
return null;
char[] ca = s.toCharArray();
for (int i = 0; i < ca.length/2; i++) {
int j = ca.length-i-1;
char c = ca[i];
ca[i] = ca[j];
ca[j] = c;
}
return String.valueOf(ca);
}
public static void main(String[] args) {
System.out.println(reverse(null));
System.out.println(reverse(""));
System.out.println(reverse("54321"));
System.out.println(reverse("4321"));
}
}
打印:
空
empty line
12345
1234
答案 1 :(得分:2)
您正在读写同一个数组。这样:
char c2[]=c;
不正确
你想:
char c2[]= new char[c.length];
答案 2 :(得分:0)
这是一个参考问题。
char c2[]=c;
这不会复制数组,只会复制它的引用。所以c2和c是相同的数组。在你的循环中,你用最后一个字符覆盖第一个字符。最简单的解决方案是使用:
char c2[]= new char[j];
所以你有两个数组,没有参考问题。
另外,您可以在原地交换数组。循环直到一半并交换第一和第二半的元素。
答案 3 :(得分:0)
您的作业char c2[]=c;
会将c
的引用分配给c2
。您应该使用c
创建长度相同的数组。
所以你应该写;
char c2[] = new char[j];
或
char c2[] = a. toCharArray()
在内存中创建带差异引用的数组。
答案 4 :(得分:0)
正如其他答案所提到的,你必须在数组中途停止。
我想补充一点,Java有StringBuilder.reverse()方法,它也可以在字符数组上运行。以下内容改编自官方源代码:
private static String reverse(String s) {
char[] chars = s.toCharArray();
int length = s.length();
for (int j = (length-1) / 2; j >= 0; j--) {
int k = length - j - 1;
char cj = chars[j];
char ck = chars[k];
chars[j] = ck;
chars[k] = cj;
}
return new String(chars);
}