Được gửi bởi
saido317
vừa sắp xếp vừa đếm sau lại sắp xếp là sao bạn nói mình chả hiểu, copy wa thêm 1 chuỗi phụ, sắp xếp và làm việc cần làm thôi.
còn theo như bạn nói ở trên thì bạn sẽ cho vòng lặp chạy từ ký tự A -> Z phải kô nào, như thế thì vòng lặp lúc nào cũng phải chạy đúng 26 lần, nếu so 2 thuật toán thì chi phí cho thuật toán của mình vẫn tốt hơn chứ. lập trình chứ đâu phải toán học đâu bạn, kô phải code ngắn hơn là thuật toán đó hay hơn đâu
Cái này nghe có vẻ ổn, nhưng cũng chưa ổn lắm, vì ký tự gõ trên bàn phím thì không chỉ có đơn thuần A-Z, mà còn có 0-9, các mã khác, chưa kể cách bấm alternate (sử dụng Alt+[numpad]). Ngoài ra cần phải tính độ phức tạp xem thuật toán này có tốt không. Nếu áp dụng cách này vào trường hợp xâu là nội dung một văn bản dài sẽ không khả thi.
chinh_2525
bạn có thể đổi các chuỗi kí tự thành mã assi và đếm số mã này xuất hiện. xong thì bạn chuyển nó thành kí tự. thế là xong rồi.
Cái này vẫn chung chung. Cũng cần mô tả kỹ hơn cách làm thế nào để tính được độ phức tạp của thuật toán.
-----
Nếu làm trên C\C++ mình nghĩ đơn giản như sau:
Code:
1. Khai báo 2 mảng m1, m2.
a. Mảng 1 lưu các ký tự xuất hiện trong xâu, bỏ qua ký tự lặp (nếu là ASCII từ bàn phím thì trên lý thuyết mảng chỉ có tối đa 256 phần tử, mặc dầu sẽ không bao giờ tới được).
b. Mảng 2 lưu tần số xuất hiện của ký tự trong xâu được nhập đó.
2. Duyệt xâu từ đầu đến cuối xau[i] i=0,length-1, đồng thời đẩy từng ký tự nếu chưa có vào mảng 1, bằng cách tìm xau[i] trong m1 m1[j]=xau[i], khởi tạo tần số xuất hiện m2[j]=0, nếu có cập nhật tần số xuất hiện m2[j]=m2[j]+1.
3. Một vòng lặp tìm max trong m2 có chỉ số k, in ra kết quả ký tự m1[k] có tần số xuất hiện m2[k] lớn nhất. Có thể gộp bước này vào bước 2 luôn để xác định max cho tối ưu, nhưng code viết sẽ hơi khó đọc.
Bookmarks