Обратная строка в Java без использования каких-либо временных String, Char или String Builder - PullRequest
7 голосов
/ 30 сентября 2011

Возможно ли обратить String в Java без использования каких-либо временных переменных, таких как String, Char[] или StringBuilder?

Можно использовать только int или int[].

Ответы [ 11 ]

11 голосов
/ 30 сентября 2011
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, здесь я создаю новые строки для каждой итерации, с той лишь разницей, что я не представляю новую ссылку, а я только счетчик.

10 голосов
/ 30 сентября 2011

Объекты класса Java String являются неизменными - их содержимое не может быть изменено после создания.

Вам понадобится как минимум два временных объекта - одиндля окончательного результата и один для промежуточных значений - даже если вы найдете способ избежать использования локальной переменной.

РЕДАКТИРОВАТЬ:

Тем не менее, так как вы можете использовать int[] выможет быть в состоянии обмануть.

Поскольку char можно назначить на int, вы можете использовать String.charAt(), чтобы создать массив int со значениями символов в обратном порядке.,Или вам может быть разрешено использовать String.toCharArray() для получения массива char, который будет скопирован во временный int[].

Затем вы используете переменную, которая содержит ссылку на исходную строку (илипеременная результата, если она вам разрешена, начинается с пустой строки (ее легко получить с помощью прямого присваивания или String.substring()) и используйте String.concat() для создания конечного результата.

Однако ни в коем случае, однако,, сможете ли вы поменять местами символы, как это было бы в C / C ++.

EDIT 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));
}
5 голосов
/ 30 сентября 2011

Один из многих способов:

    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);
3 голосов
/ 30 сентября 2011
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

Нет временных переменных!:)

1 голос
/ 02 февраля 2015
public String reverseStr(String str) {
    if (str.length() <= 1) {
        return str;
    }

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

}
1 голос
/ 02 февраля 2015

Сначала добавьте строку к себе в обратном порядке. Тогда возьмите вторую половину из этого.

  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);
    }

}
1 голос
/ 30 сентября 2011

Поскольку вы можете использовать int, вы можете присвоить int значение типа char:

String aString = "abc";

int intChar = aString.charAt(0);

Вам придется преобразовать int обратно в тип char, чтобы присвоить его aString.charAt (2).

Я уверен, что вы можете понять это оттуда.

0 голосов
/ 23 января 2018
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);
}

За исключением переменных цикла.

0 голосов
/ 17 мая 2017
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));
}
}
0 голосов
/ 26 сентября 2016

Без использования какой-либо коллекции 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);
}

Выход

Реверс == Ускорение

Надеюсь, это поможет:)

...