5 bài toán lập trình mà bất kể lập trình viên nào cũng cần có khả năng giải quyết trong vòng 1 giờ
Người viết: Vu Long Problem 1 Viết 3 hàm tính tổng của các số trong 1 dãy cho trước sử dụng for-loop, while-loop, và để quy. Problem 2 Viết 1 hàm kết hợp 2 dãy bằng cách xen kẽ các phần tử, Ví dụ: cho 2 dãy [a, b, c] và [1, 2, 3], hàm trả về [a, 1, b, 2, c, 3]. Problem 3 ...
Người viết: Vu Long
Problem 1
Viết 3 hàm tính tổng của các số trong 1 dãy cho trước sử dụng for-loop, while-loop, và để quy.
Problem 2
Viết 1 hàm kết hợp 2 dãy bằng cách xen kẽ các phần tử, Ví dụ: cho 2 dãy [a, b, c] và [1, 2, 3], hàm trả về [a, 1, b, 2, c, 3].
Problem 3
Viết 1 hàm in ra 100 số Fibonacci đầu tiên. (0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …)
Problem 4
Viết 1 hàm nhận vào 1 dãy các số nguyên không âm, sắp xếp chúng sao cho hợp thành 1 số lớn nhất có thể. Ví dụ nhận vào dãy [40, 1, 99, 12], hàm trả về 9940121.
Problem 5
Cho 1 dãy các số 1, 2, 3, 4, …, 9. Thêm các dấu +, – vào giữa các số này sao cho kết quả của phép tính = 100. Ví dụ 1 + 2 + 34 – 5 + 67 – 8 + 9 = 100. Viết 1 hàm in ra tất cả các cách thêm dấu.
Đáp án
Problem 1, 2, 3 khá đơn giản nên mình chỉ viết lời giải cho problem 4 và 5.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// Problem 4 function solution4(list){ list = list.slice(); return list.sort(function(x, y){ return (x+'+y < y+'+x) ? 1 : -1; }).join('); } // Problem 5 function solution5(){ // first calculate all possible combinations // of numbers and operators var mem = ["1"], combos; for(var i = 2; i <= 9; i++){ combos = []; mem.forEach(function(x){ combos.push(x + i, x + " +" + i, x + " -" + i); }); mem = combos; } // Now filter out the ones that equal 100 return combos.filter(function(combo){ // split a combo into numbers, sum them using reduce return combo.split(" ").reduce(function(x,y){ return x/1+y/1; }) == 100; // and check if the sum is 100 }) } |
I’m sure there are better solutions to these problems. I’d love to see them.
Techtalk via Viblo