在java中反转字符串的代码: 注意:一个或两个额外的变量是好的。数组的额外副本不是。
现在我实施了一个算法如下:
public static void removeDuplicates(char[] str) {
if (str == null) return;
int len = str.length;
if (len < 2) return;
int tail = 1;
for (int i = 1; i < len; ++i) {
int j;
for (j = 0; j < tail; ++j) {
if (str[i] == str[j]) break;
}
if (j == tail) {
str[tail] = str[i];
++tail;
}
}
str[tail] = something //something to mark end of char array eg '\0' as we have in C
}
答案 0 :(得分:3)
我会这样做(伪代码):
// s is array of char that holds the string
i=0
j=s.length - 1
while (i < j)
swap characters at positions i and j
i++
j--
答案 1 :(得分:1)
尝试使用Apache Commons StringUtils类:
http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/StringUtils.html
它具有很好的反向功能:
static String reverse(String str);
答案 2 :(得分:1)
如果没有额外的空间,你不能在java中反转String,因为String在java中是不可变的。
这似乎是一个棘手的问题......
如果你想要反转char []它应该是这样的:
char[] str = "abcdefg".toCharArray();
int len = str.length;
int n = len / 2;
for (int i = 0;i<n;i++) {
char temp = str[i];
str[i] = str[len-1-i];
str[len-1-i] = temp;
}
System.out.println(str);
答案 3 :(得分:0)
如上所述,无法反转String对象,因为Java中的字符串对象是不可变的。
你可以通过使用反射访问底层数组来避免这种情况(见下文),但这是不可取的。
如果我们将问题视为char[]
(或任何其他数组)的工作,那么很容易:
/**
* reverses an array by swapping its elements.
*/
public static void reverse(char[] array) {
reverse(array, 0, array.length);
}
/**
* reverses a section of an array by swapping its elements.
* @param start the start of the section, inclusive
* @param end the end of the section, exclusive
*/
public static void reverse(char[] array, int start, int end) {
for(int i = start, j = end-1; i < j; i++, j--) {
swap(array, i, j);
}
}
/**
* swaps two array elements.
*/
private static void swap(char[] array, int i, int j) {
char help = array[i];
array[i] = array[j];
array[j] = help;
}
有了这个,我们现在也可以作弊来扭转现有的字符串:
public static void reverse(String s) {
Class<String> sClass = String.class;
char[] array = (char[])sClass.getDeclaredField("value").get(s);
int start = sClass.getDeclaredField("offset").getInt(s);
int len = sClass.getDeclaredField("count").getInt(s);
reverse(array, start, start+len);
}
如上所述,这是不可取的,因为整个VM和标准库都基于字符串是不可变的这一事实。此外,此处的字段名称取自1.6.0_13 Sun实现,其他VM可能具有这些字段的其他名称,或者以其他方式存储字符串。
答案 4 :(得分:-2)
也许是这样的?
string input = "ABCD";
string result = "";
for (int i = input.length-1; i >= 0; i--)
{
result = result + input[i];
}