Cho 1 chuỗi kí tự (gồm chữ hoa, thường và số). tính trung bình cộng các số có mặt trong chuỗi đó.
VD: thu2ngay7thang4nam2018 (2+7+4+2018)/4
Tính trung bình cộng các số có mặt trong chuỗi
vì sao bạn nhìn vào chuỗi “thu2ngay7thang4nam2018” lại ra được kết quả “(2+7+4+2018)/4”
tại sao không phải là một kết quả khác mà lại là những con số đó? bạn đã làm như nào để ra được như vậy?
bạn thử dùng ngược lại như là: nếu kí tự (không >a và <z ) và (không >A và <Z ) thì kí tự đó là số
Gọi chuỗi vào là input
.
Tạo một chuỗi tạm tmp
= null.
Tạo một mảng kiểu số number
.
Duyệt input
, kiểm tra input[i]
có phải là chữ số không:
- Nếu là chữ số thì thêm nó vào
tmp
. - Nếu không phải thì chuyển chuỗi
tmp
thành số rồi đưa vàonumber
, sau đó chotmp
rỗng.
•cho chuỗi đó thành 1 mảng kí tự input
• tạo một ArrayList output
• tạo một mảng kí tự temp
để chứa mỗi lần 1 chữ số.
Duyệt input
, nếu java thì dùng hàm isLetter(...)
nếu trả về false thì add vào temp
vì nó là số ( có thể không đúng nếu có ký tự @#₫& …), hoặc quy ra mã ASCII thì số sẽ nằm trong khoảng 48 –> 57. sau khi temp đã đầy thì add số đó vào output
Cuối cùng lấy các phần tử của output
đó cộng lại chia cho size của output
chương trình sẽ chạy như này : thang4nam2018 sẽ thành input[] {t,h,a,n,g,4,n,a,m,2,0,1,8}
1/ xét từng phần tử :
•t,h,a,n,g --> false không phải số
•4 —> true --> bắt đầu add vào temp
•n ----> false --> ngừng add vào temp
•add temp vào arraylist output
•xoá temp
• tiếp tục a,m --> false
• 2 —> true —> bắt đầu add vào temp . tương tự temp cuối cùng sẽ là 2,0,1,8
• add temp vào output
vậy là ta đã có một Arraylist output [4, 2018]
cuối cùng kết quả là sum của các phần tử output chia cho output.size()
ngoài ra cần tạo thêm hàm phụ : mảng char[] thành integer
tạo arrayList Output làm gì đâu, đề chỉ yêu cầu tính tbc thôi mà, tạo array cho tốn bộ nhớ
so sánh luôn với ‘0’ & ‘9’ ý, char[i] >= ‘0’ && char[i] <= ‘9’ => return true
chưa hiểu ý bạn lắm, nếu vậy thì làm sao tách và lưu được 2, 7, 4, 2018 riêng biệt
Vẫn làm như bạn thôi, nhưng thay vì
thì cho sum += temp;
count++;
Vì đề bài k yêu cầu xuất ra các giá trị nên k cần lưu, còn nếu yêu cầu có in ra thì làm như bạn là ok rồi
đề cho input output như vậy ạ
cảm ơn mọi người
bạn nói như vậy là thua rồi
lập trình chỉ là công cụ giúp tính toán nhanh hơn mà thôi, còn tính toán như thế nào thì vẫn là nằm ở con người, bạn còn không chịu giải bằng tay cho sample coi nó ra như vậy có đúng không thì lập trình gì nữa giờ
Nếu là (2+7+4+2+0+1+8)/7 thì đơn giản, chỉ cần duyệt input từ input[0] đến ‘\0’, ký tự nào là số thì convert nó rồi cộng dồn lại :
int sum = 0, count = 0 , len = strlen[input]-1, c = 0;
for( i = 0 ; i < len ; i++) {
if( input[i] >= 0x30 && input[i] <=0x39) {
c = input[i] - 0x30; // convert ký tự sang số
sum+= c;
count++;
}
}
if( count > 0)
sum = sum/count; // tính trung bình cộng
Còn là 2018 thì phức tạp hơn nhiều. Bây giờ giả sử mình có chuỗi “1tuantruoc10122019U22 vietnamvodichseagame30” mà yêu cầu output là (1+10+12+2019+22+30)/6 thì …bó tay:D
cái đó mình thiếu rồi. vì trong ví dụ có số 2018 nên chắc thêm vài if else vào nữa
Đề bài là 1 chuỗi gồm số và chữ. K viết tách ra thì tính là 1 số thôi. Còn nếu muốn là như bạn thì cần kiểm tra xem 1 chuỗi số đó có phải ngày tháng k? Vậy đề cũng phải cho có định dạng 01012019 hay 112019… Nói chung mục đích bài này chỉ kiểm tra char[i] là số hay chữ, nếu là số có nhiều chữ số thì nhận biết đc. Đề k cần mang tính đánh đố, vì nó k thu đc kết quả gì, thuật toán cũng chỉ vậy.
- Extract numbers from a string: https://stackoverflow.com/questions/13399594/how-to-extract-numbers-from-string-in-c
- Tính trung bình cộng thì quá dễ rồi, khỏi cần search code.