Cách tối ưu chuỗi người dùng nhập vào

Hi there ! Dưới đây là code của em tự giải để làm bài này không biết còn cách nào dễ hiểu mà ngắn hơn không ? đề bài yêu cầu nhập vào chuỗi " daY nHaU HOc " sẽ cho ra “Day Nhau Hoc”. cảm ơn ạ !

cách em làm như này :
1/ method đầu dùng để kiểm tra xem trong chuỗi có 2 khoảng trắng liên tiếp không.
2/ method 2 là nếu có 2 khoảng trắng liên tiếp thì xóa 1 cái đến khi nào method 1 trả về true thì thôi
3/ method 3 là để viết hoa chữ cái đầu tiên của mỗi từ !

nhưng e vẫn thấy code quá dài và không hợp lí cho 1 câu hỏi chỉ có giá trị 1,5 điểm. mong mọi người giúp đỡ

public class StringOptima {

private static boolean kiemTra2KhoangTrangLienKe(String s) {
	char[] arr = s.toCharArray();
	for (int i = 1; i < arr.length; i++) {
		if (arr[i - 1] == ' ' && arr[i] == ' ') {
			return false;
		}
	}
	return true;
}

private static String xoaKhoangTrang(String s) {
	s = s.trim();
	StringBuilder sb = new StringBuilder(s);
	while (!kiemTra2KhoangTrangLienKe(sb.toString())) {
		for (int i = 1; i < sb.length(); i++) {
			if (sb.charAt(i - 1) == ' ' && sb.charAt(i) == ' ') {
				sb.deleteCharAt(i);
				break;
			}
		}
	}
	return sb.toString();
}

private static String inHoaChuCaiDau(String s) {
	s = s.toLowerCase();
	StringBuilder sb = new StringBuilder(s);
	sb.replace(0, 1, (sb.charAt(0) + "").toUpperCase());
	for (int i = 1; i < sb.length(); i++) {
		if (sb.charAt(i - 1) == ' ') {
			sb.replace(i, i + 1, (sb.charAt(i) + "").toUpperCase());
		}
	}
	return sb.toString();
}

public static String toiUuChuoi(String s) {
	return inHoaChuCaiDau(xoaKhoangTrang(s));
}

public static void main(String[] args) {
	String s = "  dAY   nHaU      hoC    ";
	System.out.println(toiUuChuoi(s));
	// Ket Qua :   Day Nhau Hoc  
}

}

Không được dùng StringTokenizer thì dùng Pattern :smiling_imp:

Cách của bạn quả là chưa tối ưu, phương thức và vòng lặp được gọi lại nhiều quá.

Tất cả nên thực hiện trong 1 phương thức và 1 vòng lặp.
Lặp 1 lần, trong quá trình lặp từng kí tự sẽ đồng thời thực hiện: loại bỏ khoảng trắng, viết HOA kí tự đầu từ, chuyển các kí tự khác của từ thành thường.

4 Likes
import java.util.Scanner;
public class Test
{
    private static final int MODE_CHARACTER = 0;
    private static final int MODE_SPACE = 1;
    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String... args)
    {
        System.out.print("Nhap chuoi: ");
        String input = scanner.nextLine();

        StringBuilder output = new StringBuilder();
        int lastCharMode = MODE_SPACE;
        for (int i = 0; i < input.length(); i += 1)
        {
            char ch = input.charAt(i);
            if (lastCharMode == MODE_CHARACTER)
            {
                if (Character.isLetter(ch))
                {
                    output.append(Character.toLowerCase(ch));
                    continue;
                }
                output.append(' ');
                lastCharMode = MODE_SPACE;
                continue;    
            }
            if (Character.isLetter(ch))
            {
                output.append(Character.toUpperCase(ch));
                lastCharMode = MODE_CHARACTER;
            }
        }

        System.out.println("Ket qua: " + output.toString());
    }
}
7 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?