Mục lục
- 1 B3. Character unique
- 1.1 B4. Reverse String
- 1.2 Bài 5. String not contains digit
- 1.3 B6. Count number of vowels and consonants
- 1.4 B7. Convert string number to int value
- 1.5 B8. Replace character
- 1.6 B9. Revert string by word
- 1.7 B10. Check string palindrome
- 1.8 B11. Remove character duplicate
- 1.9 B12. Find longest palindrome substring
- 1.10 B13. Find interleavings string
- 1.11 B14. Longest substring without repeating
- 1.12 B15. Find second most frequent character in a given string
- 1.13 B16. Print all permutations of a string
- 1.14 B17. Divide a string
- 1.15 B18. Remove all adjacent duplicates
- 1.16 B19. Append string together
String trong java là một chuỗi các ký tự trong java. Trong công việc lập trình hằng ngày chúng ta chắc hẳn sẽ phải đối mặt với rất nhiều trong việc xử lý chuỗi. Để chuẩn bị trước các tình huống khó khăn thì mình có sưu tầm một số bài tập về String hay + khó để các bạn luyện tập trước.
Không những luyện tư duy xử lý chuỗi mà các bài tập này giúp chúng ta nhớ lại toàn bộ kiến thức về chuỗi trong java.
B1. Character duplicate
Tìm và in ra các ký tự xuất hiện nhiều hơn một lần trong String cho trước không phân biệt chữ hoa hay chữ thường. Nếu các ký tự trong chuỗi đều là duy nhất thì xuất ra “NO”. Ví dụ chuỗi “Java” thì có ký tự ‘a’ hoặc String “JaVA” cũng có kết quả tương tự.
Gợi ý: Sử dụng HashMap,
B2. String Anagram
Kiểm tra 2 chuỗi có là đảo ngược của nhau hay không. Nếu có xuất ra “OK” ngược lại “KO”. Ví dụ “word” và “drow” là 2 chuỗi đảo ngược nhau.
B3. Character unique
Tìm ký tự chỉ xuất hiện một lần trong chuỗi, nếu có nhiều hơn một thì xuất ra màn hình ký tự đầu tiên. Nếu không có ký tự nào unique xuất ra “NO”.
Gợi ý:
- Sử dụng LinkedHashMap.
- HashMap kết hợp với duyệt lại chuỗi để tìm ra ký tự đầu tiên xuất hiện một lần.
B4. Reverse String
Đảo ngược chuỗi sử dụng vòng lặp và đệ quy.
Gợi ý: Sử dụng StringBuilder hoặc StringBuffer để dễ dàng thao tác hơn, tránh sử dụng String ví nó có tính chất immutable việc thao tác trên chúng sẽ khiến nó tạo thêm một String mới gây hao tổn bộ nhớ.
Bài 5. String not contains digit
Kiểm tra một chuỗi có chứa chữ số hay không, nếu có in ra false ngược lại true.
Ví dụ
“abc”, “” => true
“1abc”, “abc1”, “123”, “a1bc”, null => false
Gợi ý: Sử dụng java regex nếu bạn quen với việc sử dụng chúng. Đây cũng là cách ngắn gọn nhất. Hoặc bạn có thể loop và kiểm tra từng ký tự trong chuỗi.
B6. Count number of vowels and consonants
Đếm số lượng ký tự nguyên âm và phụ âm xuất hiện trong chuỗi. Ví dụ chuỗi “java” có 2 nguyên âm “a” và 2 phụ âm “j” và “v”.
Gợi ý: Dùng switch case để đếm số lượng ký tự nguyên âm. Số phụ âm sẽ là độ dài của chuỗi trừ cho số lượng phụ âm.
B7. Convert string number to int value
Chuyển chuỗi số nguyên sang int value. Ví dụ “5646” thành int = 5646.
Gợi ý: Dùng Integer wrapper class để convert string sang int nhanh chóng.
B8. Replace character
Cho một chuỗi str, chuyển các ký tự được chỉ định sang một ký tự khác cho trước. Ví dụ “shareprogramming.net” chuyển ‘e’ sang ‘*’ kết qủa “shar*programming.n*t”.
Gợi ý: Các bạn có thể dùng String#replace() hoặc StringBuilder để loop và thao tác.
B9. Revert string by word
Đảo ngược các ký tự của chuỗi cách nhau bởi dấu cách mà không dùng thư viện. Ví dụ “I am developer ” => “developer am I”. Các ký tự bên trong chỉ cách nhau đúng một dấu khoảng cách.
Gợi ý: Các bạn cần loại bỏ dấu cách ở đầu và cuối câu, thao tác cắt chuỗi theo dấu cách và dùng StringBuilder hoặc StringBuffer để nối chuỗi.
B10. Check string palindrome
Chuỗi palindrome là chuỗi sau khi đảo ngược và chuỗi ban đầu hoàn toàn giống nhau, ví dụ “aba” là một chuỗi “aba”
Gợi ý: Đảo ngược chuỗi và so sánh với chuỗi ban đầu hoặc loop và so sánh từng cặp chữ một.
B11. Remove character duplicate
Cho một chuỗi str, xoá các ký tự xuất hiện nhiều hơn một lần trong chuỗi và chỉ giữ lại ký tự đầu tiên, vi dụ bananas => bans
Gợi ý: Sử dụng HashSet hoặc ArrayList lưu các ký tự đã xuất hiện trong lúc duyệt. Nếu ký tự được duyệt chưa có tỏng HashSet hoặc ArrayList thì cộng ký tự đó vào chuỗi kết quả và thêm ký tự đó vào HashSet hoặc ArrayList. Lưu ý sử dụng StringBuilder hoặc StringBuffer để thao tác cộng chuỗi.
B12. Find longest palindrome substring
Tìm substring palindrome dài nhất trong một chuỗi cho trước. Biết rằng chuỗi palindrome là chuỗi sau khi đảo ngược và chuỗi ban đầu giống nhau.
B13. Find interleavings string
Tìm xem có bao nhiêu chuỗi xen kẽ từ 2 chuỗi cho trước. Giả sử rằng các ký tự trong 2 chuỗi là khác nhau.
Ví dụ cho hai chuỗi “WX” và “YZ” thì các chuỗi có thể tạo nên là: YWZX, WYZX, YWXZ, WXYZ, YZWX, WYXZ.
Gợi ý: Sử dụng đệ quy bóc tách từng ký tự trong từng chuỗi ra và thử vào chuỗi kết quả.
B14. Longest substring without repeating
Viết chương trình tìm độ dài chuỗi con lớn nhất mà các ký tự không trùng lặp.
Ví dụ: “pickoutthelongestsubstring” => “ubstring”.
Gợi ý: Sử dụng LinkedHashMap<Character, Integer>(key là ký tự tại vị trí index là value) duyệt qua từng ký tự trong chuỗi và kiểm tra.
B15. Find second most frequent character in a given string
Viết chương trình tìm ký tự xuất hiện nhiều thứ 2 trong chuỗi. Nếu nhiều ký tự thoả thì in bất kỳ ký tự nào. Không phân biệt chữ hoa với chữ thường.
Ví dụ: “Successes” => “c”
Gợi ý: Khai báo mảng int [256] tương ứng với số lượng ký tự có thể có. Duyệt chuỗi với mỗi lần xuất hiện thì tăng lên 1 tại [str.charAt[i]]. Sau khi đã có số lần xuất hiện thì chỉ việc so sánh và lấy lý tự xuất hiện nhiều thứ nhì bằng nhiều cách như sắp xếp, duyệt etc
B16. Print all permutations of a string
Viết chương trình in tất cả các chuỗi có thể có từ các ký tự của một chuỗi cho trước.
Ví dụ: “PQR” => PPP PPQ PPR PQP PQQ PQR PRP PRQ PRR QPP QPQ QPR QQP QQQ QQR QRP QRQ QRR RPP RPQ RPR RQP RQQ RQR RRP RRQ RRR.
Gợi ý sử dụng đệ quy theo quy tắc sau
/**
* PQR P
* I = 0 =>
* PQR PP I=0 PQR PPP
* PQR PP I=1 PQR PPQ
* PQR PP I=2 PQR PPR
* I = 1 =>
* PQR PQ I=0 PQR PQP
* PQR PQ I=1 PQR PQQ
* PQR PQ I=2 PQR PQR
*/
B17. Divide a string
Cho một chuỗi str và số nguyên n >= 0. Chia chuỗi str ra làm các phần bằng nhau với n ký tự. Nếu chuỗi không chia được thì xuất ra màn hình “KO”.
Ví dụ:
abcdefghijklmnopqrstuvwxy, n = 5 =>abcde fghij klmno pqrst uvwxy
B18. Remove all adjacent duplicates
Xoá tất cả các ký tự liền kề và giống nhau. Ví dụ aabaarbarccrabmq thì kết quả là brmq.
B19. Append string together
Cho 2 string, gắn chúng lại với nhau, nếu 2 chuỗi có độ dài không bằng nhau thì tiến hành cắt bỏ các ký tự đầu của string dài hơn cho đến khi chúng bằng nhau thì tiến hành gắn lại. Ví dụ Welcome và home => comehome.