Обратная строка в Java без использования временной строки, символа или построителя строк

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

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


person kaibuki    schedule 30.09.2011    source источник
comment
Это домашнее задание? Не будет ли использование int или int[] временным?   -  person wkl    schedule 30.09.2011
comment
Любой метод, который переворачивает строку, должен полагаться на временную информацию, независимо от того, инкапсулирована она или нет.   -  person DJ Quimby    schedule 30.09.2011
comment
@Eng.Fouad: он сказал, что не может иметь StringBuffers или что-то в этом роде   -  person Aleks G    schedule 30.09.2011
comment
Это не домашнее задание, просто мне пришло в голову задать вопрос кандидату на собеседование, я сам работаю над тем, как это сделать без временных переменных.   -  person kaibuki    schedule 30.09.2011
comment
@birryree, int или int [] не может хранить String/Char. мы можем использовать типы данных, которые не хранят sting/char   -  person kaibuki    schedule 30.09.2011
comment
@Eng.Fuaad, строковый буфер - это снова одно и то же :)   -  person kaibuki    schedule 30.09.2011
comment
Я думаю, что этот был забит до смерти, например, на CodeMonkey. Int[] - это просто другой вариант временного.   -  person Ed Staub    schedule 30.09.2011
comment
Создайте вызов JNI, передав строку в функцию C, а затем получите указатель на char * из структуры jstring, после чего вы сможете перевернуть char * на месте. Нет необходимости в использовании других классов или создании объектов. Хотя может и не совсем то, что нужно.   -  person Matthew Farwell    schedule 30.09.2011
comment
@kaibuki Вы хотите задать кандидатам вопрос на собеседовании, на который не смогли ответить?   -  person Jim    schedule 30.09.2011
comment
stackoverflow .com/questions/29050310/   -  person hossein ketabi    schedule 08.09.2015


Ответы (9)


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.

person stivlo    schedule 30.09.2011
comment
Это гениально !! Спасибо за перспективу! - person Codebeginner; 07.08.2018

Объекты класса 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));
}
person thkala    schedule 30.09.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);
person claymore1977    schedule 30.09.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

Никаких временных переменных! :)

person Eng.Fouad    schedule 30.09.2011

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

String aString = "abc";

int intChar = aString.charAt(0);

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

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

person Community    schedule 30.09.2011

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

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

}
person Praveen Kumar    schedule 02.02.2015

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

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

person I_Tech_Avi    schedule 26.09.2016

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

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

person Mani Kasi    schedule 23.01.2018

Вы можете использовать класс java.lang.StringBuilder:

String reservedString = new StringBuilder(str).reserve().toString();
person Nam Vu Hoang    schedule 15.05.2013
comment
ОП сказал без StringBuilder - person John61590; 16.04.2014
comment
Вопрос говорит без использования библиотеки StringBuilder - person Vaibhav Atray; 12.06.2021