Обратная строка в Java

467

я имею "Hello World" держал в строковой переменной с именем hi.

Мне нужно распечатать, но в обратном порядке.

Как я могу это сделать? Я понимаю, что в Java уже встроена какая-то функция, которая делает это.

Связанный: Обратное каждое отдельное слово строки «Hello World» с Java

Рон
источник
7
@JRL действительно должен быть String ih = "dlroW olleH"; System.out.println (Ih);
Мэтью Фарвелл
4
Я хотел бы отозвать свой закрытый голос (как дубликат). Я перечитал другой вопрос и понял, что он немного отличается от этого. Тем не менее, этот вопрос все еще дублируется на сайте. Вероятно, следует просто найти другой вопрос, чтобы отметить это обман.
Роб Хруска
Вы можете использовать функцию reverse () класса StringBuilder, метод toCharArray (), обмен символов и многое другое. обратитесь к этому ресурсу для получения дополнительных примеров, flowerbrackets.com/2-best-ways-to-reverse-a-string-in-java
Шива
StringBuilder.reverse () - более удобное и понятное решение.
Lokesh

Ответы:

980

Вы можете использовать это:

new StringBuilder(hi).reverse().toString()

Или для версий более ранних, чем JDK 1.5, используйте java.util.StringBufferвместо StringBuilder- они имеют одинаковый API. Спасибо комментаторам за то, что они указали, что StringBuilderпредпочтительнее в настоящее время, когда нет проблем с параллелизмом.

Дэниэл Брокман
источник
13
«Спасибо комментаторам за то, что они указали, что StringBuilder является предпочтительным в настоящее время»? Существует четкое утверждение, что StringBuffer, если безопасность потока является проблемой. в противном случае можно использовать StringBuilder. StringBuilder не является заменой StringBuffer.
ha9u63ar
15
@ ha9u63ar Для этого сценария с локальным одноразовым StringBuilderпараллелизмом это не проблема (и я думаю, именно это он имел в виду).
xehpuk
2
Вот ссылка, чтобы узнать точное различие между ними: javatpoint.com/… короче: StringBuilder более эффективен, чем StringBuffer. Это не потокобезопасно, то есть несколько потоков могут одновременно вызывать методы StringBuilder.
Вишну Наранг
Это не будет работать для символов Юникода за пределами BMP, пока для объединения символов.
Нау
2
@ Даниэль Брокман, Спасибо за ваш хороший и краткий ответ. Здесь OP сказал: «Hello World» хранится в строковой переменной с именем hi . Это значит String hi = "Hello World";. Так что я думаю , что в своем ответе должна не быть никакой двойная кавычка hi. Я имею в виду, что это должно быть такnew StringBuilder(hi).reverse().toString()
Md. Абу Нафи Ибна Захид
109

Для проблем с онлайн-судьями, которые не разрешают StringBuilderили StringBuffer, вы можете сделать это на месте, используя char[]следующее:

public static String reverse(String input){
    char[] in = input.toCharArray();
    int begin=0;
    int end=in.length-1;
    char temp;
    while(end>begin){
        temp = in[begin];
        in[begin]=in[end];
        in[end] = temp;
        end--;
        begin++;
    }
    return new String(in);
}
Сами Эльтамавы
источник
Просто заметка, хотя. Это ужасно потерпит неудачу для «символов», которые занимают два байта.
Минас Мина
На самом деле, это нормально работает для большинства символов, которые занимают 2 байта. То, для чего это фактически терпит неудачу, является кодовыми точками Unicode, которые занимают 2 x 16-битных кодовых единиц (в UTF-16).
Стивен С
Это хорошее решение, но можем ли мы сделать то же самое, если у нас есть 10 000 символов в строке с минимальной сложностью.
Джатиндер Кумар
62
public static String reverseIt(String source) {
    int i, len = source.length();
    StringBuilder dest = new StringBuilder(len);

    for (i = (len - 1); i >= 0; i--){
        dest.append(source.charAt(i));
    }

    return dest.toString();
}

http://www.java2s.com/Code/Java/Language-Basics/ReverseStringTest.htm

Кевин Бауэрсокс
источник
4
Хорошее решение (1+). Одно из улучшений - StringBuilder (начиная с java5) будет быстрее, чем StringBuffer. С уважением.
Михал Шрайер
31
Это не будет работать в общем случае, так как не учитывает, что некоторые «символы» в юникоде представлены суррогатной парой, то есть двумя символами Java, и это решение приводит к тому, что пара находится в неправильном порядке. Обратный метод StringBuilder должен быть тонким в соответствии с JavaDoc: docs.oracle.com/javase/7/docs/api/java/lang/...
Ян Fairman
59
String string="whatever";
String reverse = new StringBuffer(string).reverse().toString();
System.out.println(reverse);
Лучиан Григоре
источник
7
Какова сложность этого? O (N) или больше? N равно длине строки.
Mukit09
O (n), поскольку он должен перебирать символы строки хотя бы один раз.
PlsWork
26

Я делаю это с помощью следующих двух способов:

Обратная строка по CHARACTERS:

public static void main(String[] args) {
    // Using traditional approach
    String result="";
    for(int i=string.length()-1; i>=0; i--) {
        result = result + string.charAt(i);
    }
    System.out.println(result);

    // Using StringBuffer class
    StringBuffer buffer = new StringBuffer(string);
    System.out.println(buffer.reverse());    
}

Обратная строка по словам:

public static void reverseStringByWords(String string) {
    StringBuilder stringBuilder = new StringBuilder();
    String[] words = string.split(" ");

    for (int j = words.length-1; j >= 0; j--) {
        stringBuilder.append(words[j]).append(' ');
    }
    System.out.println("Reverse words: " + stringBuilder);
}
Викасдип Сингх
источник
19

Взгляните на API Java 6 под StringBuffer

String s = "sample";
String result = new StringBuffer(s).reverse().toString();
Эндрю Бриггс
источник
это лучше, чем StringBuilder?
CamHart
@ CamHart Нет, это медленнее, но, вероятно, только чуть-чуть.
jcsahnwaldt говорит GoFundMonica
1
Небольшой тест с почти 100 миллионами вызовов методов показал значительную разницу между StringBuffer и StringBuilder: stackoverflow.com/questions/355089/… Но в этом случае есть только два вызова ( reverse()и toString()), поэтому разница, вероятно, даже не будет измеримы.
jcsahnwaldt говорит GoFundMonica
17

Вот пример использования рекурсии:

public void reverseString() {
    String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String reverseAlphabet = reverse(alphabet, alphabet.length()-1);
}

String reverse(String stringToReverse, int index){
    if(index == 0){
        return stringToReverse.charAt(0) + "";
    }

    char letter = stringToReverse.charAt(index);
    return letter + reverse(stringToReverse, index-1);
}
C0D3LIC1OU5
источник
2
Уже есть гораздо лучшие ответы, особенно @ DanielBrockman's. Если алгоритм уже существует в стандартной библиотеке, нет необходимости создавать его вручную и заново изобретать колесо.
Вилли Ментцель
14
Понятие «гораздо лучший ответ» субъективно. Это может быть именно то, что кто-то ищет.
C0D3LIC1OU5
2
ОП уже заявил, что «в Java уже встроена какая-то функция, которая делает это», поэтому его целью было точно узнать, что это за «функция». Просто публиковать ответ, который не имеет ничего общего с заданным вопросом, не имеет смысла. Если бы кто-то попросил индивидуальную реализацию, ваш ответ был бы оправданным, в этом случае это не так.
Вилли Ментцель
Downvote. Большинство других решений - это O (n) и может обрабатывать строки практически любой длины, это O (n ^ 2) и может привести к сбою со StackOverflowError для строк длиннее, чем около 5000 символов (на виртуальной машине JDK 8, конфигурация по умолчанию) ,
jcsahnwaldt говорит GoFundMonica
1. Другие решения не используют рекурсию и могут прекрасно обрабатывать длинные строки. Зачем вам использовать рекурсию вместо итерации для такой задачи? Это не имеет никакого смысла. (За исключением случаев, когда вы работаете в среде функционального программирования, что часто приводит к проблемам, когда вы пишете код на языке императива / OO.) 2. Конкатенация строк (это невинный маленький '+') - это O (n). Вы должны быть новичком в Java, иначе вы бы это знали.
jcsahnwaldt говорит GoFundMonica
12

Вот решение низкого уровня:

import java.util.Scanner;

public class class1 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String inpStr = in.nextLine();
        System.out.println("Original String :" + inpStr);
        char temp;
        char[] arr = inpStr.toCharArray();
        int len = arr.length;
        for(int i=0; i<(inpStr.length())/2; i++,len--){
            temp = arr[i];
            arr[i] = arr[len-1];
            arr[len-1] = temp;
        }

        System.out.println("Reverse String :" + String.valueOf(arr));
    }
}
Артур Гриджио
источник
12

Я пытался, просто для удовольствия, используя стек. Вот мой код:

public String reverseString(String s) {
    Stack<Character> stack = new Stack<>();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        stack.push(s.charAt(i));
    }
    while (!stack.empty()) {
        sb.append(stack.pop());
    }
    return sb.toString();

}
Энрико Джурин
источник
11

Поскольку приведенный ниже метод (использующий XOR ) для обращения строки не указан, я прилагаю этот метод для обращения строки.

Алгоритм основан на:

1. (A XOR B) XOR B = A

2. (A XOR B) XOR A = B

Фрагмент кода:

public class ReverseUsingXOR {
    public static void main(String[] args) {
        String str = "prateek";
        reverseUsingXOR(str.toCharArray());
    }   

    /*Example:
     * str= prateek;
     * str[low]=p;
     * str[high]=k;
     * str[low]=p^k;
     * str[high]=(p^k)^k =p;
     * str[low]=(p^k)^p=k;
     * 
     * */
    public static void reverseUsingXOR(char[] str) {
        int low = 0;
        int high = str.length - 1;

        while (low < high) {
            str[low] = (char) (str[low] ^ str[high]);
            str[high] = (char) (str[low] ^ str[high]);   
            str[low] = (char) (str[low] ^ str[high]);
            low++;
            high--;
        }

        //display reversed string
        for (int i = 0; i < str.length; i++) {
            System.out.print(str[i]);
        }
    }

}

Вывод:

keetarp

Пратик Джоши
источник
8

Как уже отмечали другие, предпочтительным способом является использование:

new StringBuilder(hi).reverse().toString()

Но если вы хотите реализовать это самостоятельно, я боюсь, что остальные ответы имеют недостатки.

Причина в том, что Stringпредставляет список точек Unicode , закодированных в char[]массиве в соответствии с кодировкой переменной длины: UTF-16 .

Это означает, что некоторые кодовые точки используют один элемент массива (одну кодовую единицу), но другие используют два из них, поэтому могут существовать пары символов, которые должны рассматриваться как одна единица (последовательные суррогаты "high" и "low") ,

public static String reverseString(String s) {
    char[] chars = new char[s.length()];
    boolean twoCharCodepoint = false;
    for (int i = 0; i < s.length(); i++) {
        chars[s.length() - 1 - i] = s.charAt(i);
        if (twoCharCodepoint) {
            swap(chars, s.length() - 1 - i, s.length() - i);
        }
        twoCharCodepoint = !Character.isBmpCodePoint(s.codePointAt(i));
    }
    return new String(chars);
}

private static void swap(char[] array, int i, int j) {
    char temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

public static void main(String[] args) throws Exception {
    FileOutputStream fos = new FileOutputStream("C:/temp/reverse-string.txt");
    StringBuilder sb = new StringBuilder("Linear B Syllable B008 A: ");
    sb.appendCodePoint(65536); //http://unicode-table.com/es/#10000
    sb.append(".");
    fos.write(sb.toString().getBytes("UTF-16"));
    fos.write("\n".getBytes("UTF-16"));
    fos.write(reverseString(sb.toString()).getBytes("UTF-16"));
}
idelvall
источник
Хорошее решение, пропущена только часть, теперь обрабатывается комбинация диакритических знаков :-D
Рене
6

Это очень просто в минимальном коде строк

public class ReverseString {
    public static void main(String[] args) {
        String s1 = "neelendra";
        for(int i=s1.length()-1;i>=0;i--)
            {
                System.out.print(s1.charAt(i));
            }
    }
}
Neelendra
источник
Я собирался написать это сейчас .. Нашел, вы уже написали это!
Дженси
4

Это помогло мне

public static void main(String[] args) {

    String text = "abcdefghijklmnopqrstuvwxyz";

    for (int i = (text.length() - 1); i >= 0; i--) {
        System.out.print(text.charAt(i));
    }
}
DarkMental
источник
4

1. Использование массива символов:

public String reverseString(String inputString) {
    char[] inputStringArray = inputString.toCharArray();
    String reverseString = "";
    for (int i = inputStringArray.length - 1; i >= 0; i--) {
        reverseString += inputStringArray[i];
    }
    return reverseString;
}

2. Использование StringBuilder:

public String reverseString(String inputString) {
    StringBuilder stringBuilder = new StringBuilder(inputString);
    stringBuilder = stringBuilder.reverse();
    return stringBuilder.toString();
}

ИЛИ

return new StringBuilder(inputString).reverse().toString();
Авиджит Кармакар
источник
3
System.out.print("Please enter your name: ");
String name = keyboard.nextLine();

String reverse = new StringBuffer(name).reverse().toString();
String rev = reverse.toLowerCase();
System.out.println(rev);

Я использовал этот метод, чтобы превратить имена назад и в нижний регистр.

Небесные рыцари
источник
2
    public String reverse(String s) {

        String reversedString = "";
        for(int i=s.length(); i>0; i--) {
            reversedString += s.charAt(i-1);
        }   

        return reversedString;
    }
Дом Шахбази
источник
Опять же, суррогатные пары будут испорчены таким образом.
HyperNeutrino
@JamesSmith, не могли бы вы рассказать об этом подробнее?
Дом Шахбази
1
Некоторые символы Юникода состоят из двух символов; если эти два переключаются, строка повреждена. Кроме того, одной из часто пропускаемых ошибок является регулярное выражение.
HyperNeutrino
2

Один естественный способ обратить вспять это Stringиспользовать a StringTokenizerи стек. Stackявляется классом, который реализует простой в использовании стек объектов LIFO.

String s = "Hello My name is Sufiyan";

Положите его в стек вперед

Stack<String> myStack = new Stack<>();
StringTokenizer st = new StringTokenizer(s);
while (st.hasMoreTokens()) {
     myStack.push(st.nextToken());
}

Распечатать стопку назад

System.out.print('"' + s + '"' + " backwards by word is:\n\t\"");
while (!myStack.empty()) {
  System.out.print(myStack.pop());
  System.out.print(' ');
}

System.out.println('"');
Суфиян Гори
источник
2
public class Test {

public static void main(String args[]) {
   StringBuffer buffer = new StringBuffer("Game Plan");
   buffer.reverse();
   System.out.println(buffer);
 }  
}
Джоби Уилсон Мэтьюз
источник
Это не отвечает на вопрос.
Райан
2

Все вышеприведенное решение слишком хорошо, но здесь я делаю обратную строку, используя рекурсивное программирование.

Это полезно для тех, кто ищет рекурсивный способ сделать обратную строку.

public class ReversString {

public static void main(String args[]) {
    char s[] = "Dhiral Pandya".toCharArray();
    String r = new String(reverse(0, s));
    System.out.println(r);
}

public static char[] reverse(int i, char source[]) {

    if (source.length / 2 == i) {
        return source;
    }

    char t = source[i];
    source[i] = source[source.length - 1 - i];
    source[source.length - 1 - i] = t;

    i++;
    return reverse(i, source);

}

}
Дирал Пандья
источник
2

Процедура :

Мы можем использовать split () для разделения строки. Затем используем обратный цикл и добавляем символы.


Фрагмент кода:

class test
{
  public static void main(String args[]) 
  {
      String str = "world";
      String[] split= str.split("");

      String revers = "";
      for (int i = split.length-1; i>=0; i--)
      {
        revers += split[i];
      }
      System.out.printf("%s", revers);
   }  
}

 //output : dlrow

rashedcs
источник
1

public String reverseWords (String s) {

    String reversedWords = "";

    if(s.length()<=0) {
        return reversedWords;
    }else if(s.length() == 1){
        if(s == " "){
            return "";
        }
        return s;
    }

    char arr[] = s.toCharArray();
    int j = arr.length-1;
    while(j >= 0 ){
        if( arr[j] == ' '){
            reversedWords+=arr[j];
        }else{
            String temp="";
            while(j>=0 && arr[j] != ' '){
                temp+=arr[j];
                j--;
            }
            j++;
            temp = reverseWord(temp);
            reversedWords+=temp;
        }
        j--;

    }

    String[] chk = reversedWords.split(" ");

    if(chk == null || chk.length == 0){
        return "";
    }

    return reversedWords;



}

public String reverseWord(String s){

    char[] arr = s.toCharArray();

    for(int i=0,j=arr.length-1;i<=j;i++,j--){
        char tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
    return String.valueOf(arr);

}
РВД
источник
1

Вы также можете попробовать это:

public class StringReverse {
    public static void main(String[] args) {
        String str = "Dogs hates cats";
        StringBuffer sb = new StringBuffer(str);
        System.out.println(sb.reverse());
    }
}
Анураг Гоэль
источник
1
Есть много методов, чтобы перевернуть строку. Это один из них, использующий класс stringbuffer из java.accepted ответ использует разностный класс, который недоступен в более старой версии JDK.
Анураг Гоэль
1
public void reverString(){
System.out.println("Enter value");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
 try{

  String str=br.readLine();
  char[] charArray=str.toCharArray();
  for(int i=charArray.length-1; i>=0; i--){
   System.out.println(charArray[i]);
  }
  }
   catch(IOException ex){
  }
Дипак Сингх
источник
1

рекурсии:

 public String stringReverse(String string) {
    if (string == null || string.length() == 0) {
        return string;
    }
    return stringReverse(string.substring(1)) + string.charAt(0);
 }
connect2krish
источник
1

Просто для удовольствия .. :)

Algorithm (str,len)
char reversedStr[] =new reversedStr[len]

Пройдите от 0 до len / 2, а затем

reversedStr[i]=str[len-1-i]  
reversedStr[len-1=i]=str[i]
return reversedStr;

Сложность времени: O (n)

Космическая сложность: O (n)

public class Reverse {
    static char reversedStr[];

    public static void main(String[] args) {
        System.out.println(reversestr("jatin"));
    }


    private static String reversestr(String str) {
        int strlen = str.length();
        reversedStr = new char[strlen];

        for (int i = 0; i <= strlen / 2; i++) {
            reversedStr[i] = str.charAt(strlen - 1 - i);
            reversedStr[strlen - 1 - i] = str.charAt(i);

        }
        return new String(reversedStr);
    }

}
Джатин Гоял
источник
1
public static String revString(String str){
    char[] revCharArr = str.toCharArray();
    for (int i=0; i< str.length()/2; i++){
        char f = revCharArr[i];
        char l = revCharArr[str.length()-i-1];
        revCharArr[i] = l;
        revCharArr[str.length()-i-1] = f;
    }
    String revStr = new String(revCharArr);
    return revStr;
}
Мухаммед Аашариб Навшад
источник
1
    public static void reverseString(String s){
        System.out.println("---------");
        for(int i=s.length()-1; i>=0;i--){
            System.out.print(s.charAt(i));    
        }
        System.out.println(); 

    }
Mutlu
источник
Это просто выводит символ строки один за другим. И также это не может быть использовано где-либо в программе. Гораздо лучше создать строковую переменную, вставить в строку символ «char», а затем вернуть строку.
Зомби Чиби XD
1
    //Solution #1 -- Using array and charAt()
    String name = "reverse"; //String to reverse
    Character[] nameChar =  new Character[name.length()]; // Declaring a character array with length as length of the String which you want to reverse.
    for(int i=0;i<name.length();i++)// this will loop you through the String
    nameChar[i]=name.charAt(name.length()-1-i);// Using built in charAt() we can fetch the character at a given index. 
    for(char nam:nameChar)// Just to print the above nameChar character Array using an enhanced for loop
    System.out.print(nam);


    //Solution #2 - Using StringBuffer and reverse ().
    StringBuffer reverseString = new StringBuffer("reverse");
    System.out.println(reverseString.reverse()); //reverse () Causes the character sequence to be replaced by the reverse of the sequence.
абхи
источник
@ Дарман спасибо за ответ. добавлено объяснение и еще одно решение.
абхи
0
package logicprogram;
import java.io.*;

public class Strinrevers {
public static void main(String args[])throws IOException
{
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    System.out.println("enter data");
    String data=br.readLine();
    System.out.println(data);
    String str="";
    char cha[]=data.toCharArray();

    int l=data.length();
    int k=l-1;
    System.out.println(l);


    for(int i=0;k>=i;k--)
    {

        str+=cha[k];


    }
    //String text=String.valueOf(ch);
    System.out.println(str);

}

}
Кумаравел Дж
источник
0
import java.util.Scanner;

public class Test {

    public static void main(String[] args){
        Scanner input = new Scanner (System.in);
        String word = input.next();
        String reverse = "";
        for(int i=word.length()-1; i>=0; i--)
            reverse += word.charAt(i);
        System.out.println(reverse);        
    }
}

Если вы хотите использовать простой цикл for!

Апетрей Ионут
источник