Mục lục
Đảo ngược chuỗi có lẽ là một trong những bài toán phổ biến đối với những bạn vừa học đến phần String trong Java. Để triển khai bài này, chúng ta có rất nhiều cách, trong bài viết này chúng ta sẽ cùng nhau điểm qua một số cách cơ bản để các bạn có thể tham khảo.
Một số lưu ý trước khi làm bài này để tránh các lỗi cơ bản có thể ảnh hưởng nghiêm trọng đến hiệu xuất của chương trình:
- String là immutable class, sau khi khởi tạo sẽ không thể chỉnh sửa, vì vậy việc chúng ta thao tác trên một chuỗi có sẵn như cộng chuỗi, cắt chuỗi đều sẽ tạo ra một string mới.
- String class không chứa hàm reverse() xây dựng sẵn dùng để đảo ngược chuỗi tuy nhiên StringBuilder thì có.
- Lớp StringBuilder không có hàm toCharArray(), trong khi lớp String có hàm toCharArray().
Cách 1 – Chuyển đổi String sang byte
B1: Sử dụng getBytes() method để chuyển String sang mảng byte[].
B2: Khởi tạo mảng byte[] có chiều dài bằng với số lượng ký tự chứa trong string và lưu trữ các byte được chuyển từ string sang ở B1.
B3: Khởi tạo mảng result byte[] dùng để lưu kết quả đảo ngược bằng cách duyệt ngược các phần tử trong mảng byte ở B2:
class ReverseString { public static void main(String[] args) { String input = "DeftBlog"; // getBytes() method to convert string // into bytes[]. byte[] strAsByteArray = input.getBytes(); byte[] result = new byte[strAsByteArray.length]; // Store result in reverse order into the // result byte[] for (int i = 0; i < strAsByteArray.length; i++) result[i] = strAsByteArray[strAsByteArray.length - i - 1]; System.out.println(new String(result)); } }
Output
golBtfeD
Cách 2 – Sử dụng reverse() trong StringBuilder
StringBuilder là một họ trong String không có tính chất immutable cho phép chúng ta thao tác các phép tính trên String mà không bị rò rỉ bộ nhớ. Ngoài ra nó còn cung cấp sẵn hàm reverse() cho phép đảo ngược chuỗi.
public static void main(String[] args) { String input = "DeftBlog"; StringBuilder str = new StringBuilder(input); System.out.println(str.reverse().toString()); } }
Cách 3 – Sử dụng Stack
Stack là một cấu trúc dữ liệu có tính chất FILO(First in last out), nhờ vào tính chất này chúng ta có thể dễ dàng đảo ngược chuỗi với một Stack.
class ReverseString { public static void main(String[] args) { String input = "DeftBlog"; Stack<Character> stack = new Stack<>(); for (int i = 0; i < input.length(); i++) { stack.push(input.charAt(i)); } StringBuilder str = new StringBuilder(); int size = stack.size(); for (int i = 0; i < size; i++) { str.append(stack.pop()); } System.out.println(str.toString()); } }
Cách 4 – StringBuffer
Cũng giống như StringBuilder, StringBuffer không phải là một immutable String, nó cung cấp hàm reverse() giúp chúng ta đảo ngược chuỗi nhanh chóng.
class ReverseString { public static void main(String[] args) { String input = "DeftBlog"; StringBuffer stringBuffer = new StringBuffer(input); System.out.println(stringBuffer.reverse().toString()); } }