7

String是否可以在不使用任何临时变量(如String,Char[]或)的情况下在 Java 中进行反转StringBuilder

只能使用int, 或int[].

4

11 回答 11

11
String reverseMe = "reverse me!";
for (int i = 0; i < reverseMe.length(); i++) {
    reverseMe = reverseMe.substring(1, reverseMe.length() - i)
        + reverseMe.substring(0, 1)
        + reverseMe.substring(reverseMe.length() - i, reverseMe.length());
 }
 System.out.println(reverseMe);

输出:

!em esrever

只是为了好玩,当然使用 StringBuffer 会更好,这里我为每个迭代创建新的字符串,唯一的区别是我没有引入新的引用,我只有一个 int 计数器。

于 2011-09-30T15:24:00.540 回答
10

Java String 类的对象是不可变的——它们的内容在创建后不能更改。

需要至少两个临时对象 - 一个用于最终结果,一个用于中间值 - 即使您确实找到了避免使用局部变量的方法。

编辑:

也就是说,既然你可以使用,int[]你就可以作弊。

由于char可以分配给int,因此您可以使用String.charAt()以相反顺序创建int字符值的数组。或者您可能被允许用于String.toCharArray()获取char将被复制到您的int[]临时的数组。

然后,您使用保存对原始字符串的引用的变量(或结果变量,如果允许的话)从空字符串开始(通过直接赋值或 很容易获得String.substring())并用于String.concat()创建最终结果。

但是,在任何情况下,您都不能像在 C/C++ 中那样就地交换字符。

编辑2:

这是我在内部不使用 StringBuffer/Builders 的版本:

int r[] = new int[s.length()];

int idx = r.length - 1;

for (int i : s.toCharArray()) {
    r[idx--] = i;
}

s = s.substring(0, 0);

for (int i : r) {
    s = s.concat(String.valueOf((char)i));
}
于 2011-09-30T15:16:50.127 回答
5
String s = "Hello World!";
for(int i = 0; i < s.length(); i++)
{
    s = s.substring(1, s.length() - i) + s.charAt(0) + s.substring(s.length() - i);
}
System.out.println(s); // !dlroW olleH

没有临时变量!:)

于 2011-09-30T15:21:01.127 回答
5

多种方式之一:

    String str = "The quick brown fox jumps over the lazy dog";

    int len = str.length();
    for (int i = (len-1); i >= 0; --i) 
        str += str.charAt(i);
    str = str.substring(len);

    System.out.println(str);
于 2011-09-30T15:23:50.337 回答
2
public String reverseStr(String str) {
    if (str.length() <= 1) {
        return str;
    }

    return reverseStr(str.substring(1)) + str.charAt(0);

}
于 2015-02-02T12:40:33.550 回答
1

首先以相反的方式将字符串附加到自身。然后把下半场拿出来。

  public class RevString {
    public static void main(String[] args) {
        String s="string";
        for(int i=s.length()-1;i>=0;i--){
            s+=s.charAt(i);
        }
        s=s.substring(s.length()/2, s.length());
        System.out.println(s);
    }

}
于 2015-02-02T06:31:16.077 回答
1

因为可以使用 int,所以可以为 int 分配 char 值:

String aString = "abc";

int intChar = aString.charAt(0);

您必须将 int 转换回 char 以将其分配给 aString.charAt(2)。

我相信你可以从那里弄清楚。

于 2011-09-30T15:21:43.527 回答
0
String str = "Welcome";
for(int i=0;i<str.length();){
  System.out.print(str.charAt(str.length()-1));
  str = str.substring(0,str.length()-1);
}

循环变量除外。

于 2018-01-23T10:06:26.037 回答
0
public class Test {
 static St`enter code here`ring reverseString(String str) {
    for (int i = 0; i < str.length() / 2; i++) {
        if (i == 0) {
            str = str.charAt(str.length() - 1 - i) + str.substring(i + 1, str.length() - 1 - i) + str.charAt(i);
        } else {
            str = str.substring(0, i) + str.charAt(str.length() - 1 - i)
                    + str.substring(i + 1, str.length() - 1 - i) + str.charAt(i)
                    + str.substring(str.length() - i, str.length());
        }
    }
    return str;
}

public static void main(String args[]) {

    String s = "ABCDE";
    System.out.println(Test.reverseString(s));
}
}
于 2017-05-17T11:03:02.203 回答
0

在不使用任何集合的情况下,StringBulider、StringBuffer 或临时数组反转字符串。简单明了:

public static void main(String[] args) {

    String test = "Hello World";
    String rev = "";
    Pattern p = Pattern.compile("[\\w|\\W]");
    Matcher m = p.matcher(test);
    while (m.find()) {
        rev = m.group()+rev;
    }
    System.out.println("Reverse==" + rev);
}

输出

反向==dlroW olleH

希望能帮助到你 :)

于 2016-09-26T11:08:50.857 回答
-1

您可以使用类 java.lang.StringBuilder:

String reservedString = new StringBuilder(str).reserve().toString();
于 2013-05-15T22:59:14.033 回答