Đảo ngược một chuỗi trong Java


467

Tôi đã "Hello World"giữ một biến String có tên hi.

Tôi cần in nó, nhưng đảo ngược.

Tôi có thể làm cái này như thế nào? Tôi hiểu rằng có một số loại hàm đã được tích hợp sẵn trong Java thực hiện điều đó.

Liên quan: Đảo ngược từng từ riêng lẻ của chuỗi Hello Hello World World với Java


7
@JRL thực sự phải là Chuỗi ih = "dlroW olleH"; System.out.println (ih);
Matthew Farwell

4
Tôi ước tôi có thể rút lại phiếu bầu gần của mình (như một bản sao). Tôi đọc lại câu hỏi khác và nhận ra nó khác biệt tinh tế hơn thế này. Tuy nhiên, câu hỏi này vẫn được lặp lại nhiều lần trên khắp trang web. Có lẽ chỉ nên tìm một câu hỏi khác để đánh dấu đây là một bản sao.
Rob Hruska

bạn có thể sử dụng hàm Reverse () của lớp StringBuilder, phương thức toCharArray (), hoán đổi các ký tự và nhiều thứ khác. tham khảo tài nguyên này để biết thêm ví dụ, Flowerbrackets.com/2-best-ways-to-reverse-a-opes-in-java
Shiva

StringBuilder.reverse () là giải pháp dễ đọc và thanh lịch hơn.
lokesh

Câu trả lời:


980

Bạn có thể sử dụng điều này:

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

Hoặc, đối với các phiên bản sớm hơn JDK 1.5, hãy sử dụng java.util.StringBufferthay vì StringBuilder- chúng có cùng API. Cảm ơn các nhà bình luận đã chỉ ra rằng StringBuilderngày nay được ưa thích khi không có mối quan tâm đồng thời.


13
"Cảm ơn các nhà bình luận đã chỉ ra rằng StringBuilder được ưa thích hiện nay"? Có một tuyên bố rõ ràng rằng StringBuffer nếu an toàn luồng là một mối quan tâm. mặt khác, StringBuilder có thể được sử dụng. StringBuilder không phải là sự thay thế cho StringBuffer.
ha9u63ar

15
@ ha9u63ar Đối với kịch bản này với sự StringBuilderđồng thời vứt bỏ cục bộ không phải là vấn đề đáng lo ngại (và tôi nghĩ đó là ý anh ấy).
xehpuk

2
Đây là liên kết để biết sự khác biệt chính xác giữa hai: javatpoint.com/, nói ngắn gọn: StringBuilder hiệu quả hơn StringBuffer. Nó không phải là luồng an toàn, tức là nhiều luồng có thể gọi đồng thời các phương thức của StringBuilder.
Vishnu Narang

Điều này sẽ không hoạt động đối với các ký tự Unicode bên ngoài BMP, miễn là kết hợp các ký tự.
nau

2
@Daniel Brockman, Cảm ơn bạn đã trả lời tốt đẹp và súc tích. Ở đây OP đã nói, tôi có "Hello World" được giữ trong một biến String có tên hi . Điều đó có nghĩa String hi = "Hello World";. Vì vậy, tôi nghĩ trong câu trả lời của bạn có nên không có bất kỳ dấu ngoặc kép xung quanh hi. Ý tôi là nó phải như thế nàynew StringBuilder(hi).reverse().toString()
Md. Abu Nafee Ibna Zahid

109

Đối với các vấn đề của Thẩm phán trực tuyến không cho phép StringBuilderhoặc StringBuffer, bạn có thể thực hiện tại chỗ bằng cách sử dụng char[]như sau:

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

Chỉ là một lưu ý mặc dù. Điều này sẽ thất bại khủng khiếp cho "các ký tự" chiếm hai byte.
Minas Mina

Trên thực tế, nó thường hoạt động tốt đối với hầu hết các ký tự chiếm 2 byte. Những gì nó thực sự thất bại là các điểm mã Unicode chiếm 2 mã 16 bit (trong UTF-16).
Stephen C

Đây là giải pháp tốt, nhưng chúng ta có thể làm tương tự nếu chúng ta có 10k ký tự trong chuỗi với độ phức tạp tối thiểu.
Jatinder Kumar

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/Lingu-Basics/ReverseStringTest.htm


4
Giải pháp tốt (1+). Một cải tiến - StringBuilder (kể từ java5) sẽ nhanh hơn StringBuffer. Trân trọng.
Michał rajer

31
Điều này sẽ không hoạt động trong trường hợp chung vì nó không tính đến việc một số "ký tự" trong unicode được biểu thị bằng một cặp thay thế tức là hai ký tự Java và giải pháp này dẫn đến việc cặp này bị sai thứ tự. Phương thức đảo ngược của StringBuilder sẽ ổn theo JavaDoc: docs.oracle.com/javase/7/docs/api/java/lang/ trộm
Ian Fairman

59
String string="whatever";
String reverse = new StringBuffer(string).reverse().toString();
System.out.println(reverse);

7
Sự phức tạp của nó là gì? O (N) trở lên? N bằng độ dài của chuỗi.
Mukit09

O (n) vì nó phải lặp qua các ký tự của chuỗi ít nhất một lần.
PlsWork

26

Tôi đang làm điều này bằng cách sử dụng hai cách sau:

Đảo ngược chuỗi bằng 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());    
}

Đảo ngược chuỗi bằng WORDS:

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

Hãy xem API Java 6 trong StringBuffer

String s = "sample";
String result = new StringBuffer(s).reverse().toString();

cái này tốt hơn StringBuilder phải không?
CamHart

@CamHart Không, nó chậm hơn, nhưng có lẽ chỉ một chút xíu thôi.
jcsahnwaldt nói GoFundMonica

1
Một điểm chuẩn nhỏ với gần 100 triệu cuộc gọi phương thức cho thấy sự khác biệt đáng kể giữa StringBuffer và StringBuilder: stackoverflow.com/questions355089/ trộm Nhưng trong trường hợp này, chỉ có hai cuộc gọi ( reverse()toString()), vì vậy sự khác biệt có thể sẽ không xảy ra đo lường được
jcsahnwaldt nói GoFundMonica

17

Dưới đây là một ví dụ sử dụng đệ quy:

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

2
Hiện đã có câu trả lời tốt hơn nhiều, đặc biệt là của @ DanielBrockman. Nếu một thuật toán đã tồn tại trong một thư viện tiêu chuẩn, không cần phải làm thủ công và phát minh lại bánh xe.
Willi Mentzel

14
Một khái niệm "câu trả lời tốt hơn nhiều" là chủ quan. Đây có thể là chính xác những gì ai đó đang tìm kiếm.
C0D3LIC1OU5

2
OP đã tuyên bố rằng "có một loại chức năng đã được tích hợp sẵn trong Java thực hiện điều đó" vì vậy mục tiêu của anh là biết chính xác "chức năng" này là gì. Chỉ cần đăng một câu trả lời ít liên quan đến câu hỏi thực tế là không có ý nghĩa. Nếu ai đó yêu cầu thực hiện tùy chỉnh, câu trả lời của bạn sẽ hợp lý, trong trường hợp này thì không.
Willi Mentzel

Downvote. Hầu hết các giải pháp khác là O (n) và có thể xử lý các chuỗi có độ dài gần như bất kỳ, độ dài này là O (n ^ 2) và có xu hướng gặp sự cố với StackOverflowError cho các chuỗi dài hơn khoảng 5000 ký tự (trên JDK 8 VM, cấu hình mặc định) .
jcsahnwaldt nói GoFundMonica

1. Các giải pháp khác không sử dụng đệ quy và có thể xử lý các chuỗi dài tốt. Tại sao bạn sẽ sử dụng đệ quy thay vì lặp cho một nhiệm vụ như thế này? Không có nghĩa lý gì. (Trừ khi bạn đến từ một nền tảng lập trình chức năng, điều này thường dẫn đến các vấn đề khi bạn viết mã bằng ngôn ngữ bắt buộc / OO.) 2. Nối chuỗi (chữ nhỏ vô tội '+') là O (n). Bạn phải là người mới đối với Java, nếu không bạn sẽ biết điều đó.
jcsahnwaldt nói GoFundMonica

12

Đây là một giải pháp cấp thấp:

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

Tôi đã thử, chỉ để cho vui, bằng cách sử dụng Stack. Đây là mã của tôi:

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

Vì phương thức dưới đây (sử dụng XOR ) để đảo ngược một chuỗi không được liệt kê, tôi đang đính kèm phương thức này để đảo ngược một chuỗi.

Các thuật toán dựa trên:

1. (A XOR B) XOR B = A

2. (A XOR B) XOR A = B

Đoạn mã:

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

}

Đầu ra:

củ cải đường


8

Như những người khác đã chỉ ra cách ưa thích là sử dụng:

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

Nhưng nếu bạn muốn tự mình thực hiện điều này, tôi sợ rằng phần còn lại của phản hồi có sai sót.

Lý do là Stringđại diện cho một danh sách các điểm Unicode , được mã hóa trong một char[]mảng theo mã hóa có độ dài thay đổi: UTF-16 .

Điều này có nghĩa là một số điểm mã sử dụng một phần tử của mảng (một đơn vị mã) nhưng các điểm khác sử dụng hai trong số chúng, do đó, có thể có các cặp ký tự phải được coi là một đơn vị (thay thế "cao" và "thấp" liên tiếp) .

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

Giải pháp tốt, hiện chỉ còn thiếu một phần là xử lý kết hợp các dấu phụ :-D
René

6

Nó rất đơn giản trong mã dòng tối thiểu

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

Tôi sẽ viết nó ngay bây giờ .. Tìm thấy bạn đã viết nó!
Jency

4

Điều này đã lừa tôi

public static void main(String[] args) {

    String text = "abcdefghijklmnopqrstuvwxyz";

    for (int i = (text.length() - 1); i >= 0; i--) {
        System.out.print(text.charAt(i));
    }
}

4

1. Sử dụng Mảng ký tự:

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. Sử dụng StringBuilder:

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

HOẶC LÀ

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

Tôi đã sử dụng phương pháp này để biến tên ngược và viết thường.


2
    public String reverse(String s) {

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

        return reversedString;
    }

Một lần nữa, các cặp thay thế sẽ bị hỏng theo cách này.
HyperNeutrino

@JamesSmith bạn có thể mở rộng về điều này không?
Dom Shahbazi

1
Một số ký tự unicode bao gồm hai ký tự; nếu hai cái này được chuyển xung quanh, chuỗi bị hỏng. Ngoài ra, một lỗi thường bị bỏ qua là regex.
HyperNeutrino

2

Một cách tự nhiên để đảo ngược a Stringlà sử dụng a StringTokenizervà stack. Stacklà một lớp thực hiện một ngăn xếp các đối tượng cuối cùng, ra trước (LIFO) dễ sử dụng.

String s = "Hello My name is Sufiyan";

Đặt nó trong ngăn xếp phía trước

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

In ngăn xếp ngược

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

Điều này không trả lời câu hỏi.
Ryan

2

Tất cả các giải pháp trên là quá tốt nhưng ở đây tôi đang tạo chuỗi ngược bằng cách sử dụng lập trình đệ quy.

Điều này hữu ích cho những ai đang tìm cách đệ quy chuỗi ngược.

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

Thủ tục:

Chúng ta có thể sử dụng split () để tách chuỗi. Sau đó sử dụng vòng lặp ngược và thêm các ký tự.


Đoạn mã:

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


1

công khai chuỗi đảo ngược (Chuỗi 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

Bạn cũng có thể thử điều này:

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
có nhiều phương thức để đảo ngược một chuỗi. Đây là một trong số chúng sử dụng lớp javabuffer của câu trả lời java.accepted đang sử dụng lớp diff để đảo ngược vốn không có trong phiên bản cũ hơn của JDK.
Anurag Goel

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

đệ quy:

 public String stringReverse(String string) {
    if (string == null || string.length() == 0) {
        return string;
    }
    return stringReverse(string.substring(1)) + string.charAt(0);
 }

1

Chỉ để cho vui thôi .. :)

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

Đi qua i từ 0 đến len / 2 và sau đó

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

Độ phức tạp thời gian: O (n)

Độ phức tạp không gian: 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(); 

    }

Điều này chỉ xuất ra char của chuỗi từng cái một. Và nó cũng không thể được sử dụng ở bất cứ đâu trong chương trình. Tốt hơn hết là tạo một biến Chuỗi, chèn từng chữ "char" vào chuỗi, sau đó trả về chuỗi.
Zombie Chibi 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.

@Dharman cảm ơn đã phản hồi. thêm lời giải thích và thêm một giải pháp.
abhi

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

Nếu bạn muốn sử dụng một vòng lặp đơn giản!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.