[Tổng hợp] Kể về những bài coding challenge khi phỏng vấn IT | theNEXTvoz…
thảo luận - [Tổng hợp] Kể về những bài coding challenge khi phỏng vấn IT | theNEXTvoz
ScaTteRedLife
Trước đây thì có hình thức assignment , code tầm 3-4h, deadline 1-3 ngày, và làm ở nhà, nhưng tốn thời gian quá nên dần dần bị đào thải. Vừa rồi mới biết là dạo này nhiều cty chuộng cách phỏng vấn bằng CodePair, đề bài sẽ là 1 bài toán nho nhỏ, thường code tầm dưới 20 dòng, trong vòng 20 phút đổ lại. Code chạy được thì 90% là pass vòng đó rồi, nên có thể nói đây là 1 phần rất quan trọng của bài phỏng vấn.
Đây là bài toán của mình:
- input: "123456789", phép toán: cộng, trừ
- output: chèn phép toán cộng, trừ vào input string sao cho biểu thức có kết quả là 100.
Ví dụ: -1 + 2 - 3 + 4 + 5 + 6 + 78 + 9 (=100)
- Mở rộng thêm nếu có phép nhân và chia
Bonus thông tin về vị trí này:
- Vị trí: Senior front-end
- Range: over 2k
-4 rounds (2 tech rounds)
- Office: HCM (cty Sin)
Mình nhớ mình phỏng vấn có câu thế này:
1: Check systax của các dấu []{} () có đúng hay không. Ví dụ "[[]()" là sai, "[[()]]" là đúng
2: Cho một chuỗi gồm , chữ ,số, số thập phân, hỗn sỗ(2/2/3). Trich hết tất cả số, số thập phân, phân số, hỗn số ra.
3: Xoay vòng mảng k lần ví dụ: [1,2,3], xoay 1 lần: (2,3,1), xoay 2 lân (3,1,2)
Tạm thời nhớ nhiêu đó.
Tháng trước mình có làm bài test ứng tuyển Software Engineer của 1 cty như này :
cho 1 dãy số rồi chuyển thành chữ (<9 số)
ví dụ : 105234567 -> một trăm linh năm triệu hai trăm ba mươi tư nghìn năm trăm sáu mươi bảy
Mình có pass bài test, rồi đi phỏng vấn chuyên môn, rồi vòng sau phỏng vấn với giám đốc xong về nhận mail báo tạch
)))
Hơi tiếc vì công ty đó khá tốt.
Vòng 1:
- Bài 1: Kiểm tra một chuỗi dãy ngoặc là hợp lệ, 3 loại ngoặc [({.
- Bài 2: Tìm số lớn thứ k trong mảng chưa sắp xếp, cài đặt tối ưu sao cho độ phức tạp tính toán nhỏ nhất, không dùng thư viện. Bài này mình cài heap (
make_heap,
pop_heap), chưa fix bug xong nhưng vẫn pass vòng này.
Vòng 2: Sắp xếp trên danh sách liên kết đơn. Mình cài selection sort, sau đó được yêu cầu cải tiến thì mình cài merge sort.
Trước đây thì có hình thức assignment , code tầm 3-4h, deadline 1-3 ngày, và làm ở nhà, nhưng tốn thời gian quá nên dần dần bị đào thải. Vừa rồi mới biết là dạo này nhiều cty chuộng cách phỏng vấn bằng CodePair, đề bài sẽ là 1 bài toán nho nhỏ, thường code tầm dưới 20 dòng, trong vòng 20 phút đổ lại. Code chạy được thì 90% là pass vòng đó rồi, nên có thể nói đây là 1 phần rất quan trọng của bài phỏng vấn.
Đây là bài toán của mình:
- input: "123456789", phép toán: cộng, trừ
- output: biểu thức có kết quả là 100. Ví dụ: 78+9+6+5+4-3+2-1=100
Bonus thông tin về vị trí này:
- Vị trí: Senior front-end
- Range: over 2k
-4 rounds (2 tech rounds)
- Office: HCM (cty Sin)
Bạn nào từng gặp thì chia sẻ lên cho vui.
Output chỉ cần 1 cái thôi hay là phải list all bác
Tất nhiên là tất cả kết quả rồi bạn
Vì bài này để đánh giá giải thuật mà. Cách giải thì dùng đệ quy để brute force thôi.
Nếu dùng đệ quy để brute force thì độ phức tạp lớn k bác?
EG.Arteezy
Bài của mình thì là cho 1 string không có khoảng trắng cùng với 1 cái mapping, tách các từ thành 1 câu có nghĩa, lúc đó mới ra trường đọc đề xác địch anlon luôn
Bài của ông thớt dùng recursion chạy là ra, có điều cực chậm và hên xui tùy randomization mà có tràn stack trace hay ko
Làm ra 1 cái giải thuật hiệu quả cũng căng phết đấy
Wind-Blade
đệ quy thì speed chậm và dễ tràn stack nếu lượng dữ liệu đưa qua stack (nhiều lần đệ quy đè nhau)
Nên nếu chuẩn thì trừ mấy bài toán nhỏ nhỏ còn lại hạn chế dùng
Nếu dùng đệ quy để brute force thì độ phức tạp lớn k bác?
Code mấy bài này mình cũng không quan tâm tới độ phức tạp lắm, thời gian cấp bách nữa chứ =]] Nhưng với bài này thì
11! * n 3^9 thôi. Lúc in ra kết quả mình chưa kịp chớp mắt ấy chứ.
đệ quy thì speed chậm và dễ tràn stack nếu lượng dữ liệu đưa qua stack (nhiều lần đệ quy đè nhau)
Nên nếu chuẩn thì trừ mấy bài toán nhỏ nhỏ còn lại hạn chế dùng
Nếu bạn không xài đệ quy mà giải được bài này thì chắc cho thẳng lên TA ấy chứ
Lúc giải xong thì mình cũng nói coding thực tế hiếm khi xài đệ quy, vì blah blah, rồi mình hỏi bên đó có xài đệ quy không mà ra bài này? bên kia cũng nói là đưa bài này ra xem mày có biết viết đệ quy hay không thôi =]]
Nếu bạn không xài đệ quy mà giải được bài này thì chắc cho thẳng lên TA ấy chứ
Lúc giải xong thì mình cũng nói coding thực tế hiếm khi xài đệ quy, vì blah blah, rồi mình hỏi bên đó có xài đệ quy không mà ra bài này? bên kia cũng nói là đưa bài này ra xem mày có biết viết đệ quy hay không thôi =]]
nếu mà yêu cầu trong thời gian ngắn thì vá tạm cũng là 1 giải pháp, Nhất là mấy cái yêu cầu code ngắn, dễ hiểu
)
Code mấy bài này mình cũng không quan tâm tới độ phức tạp lắm, thời gian cấp bách nữa chứ =]] Nhưng với bài này thì loanh quanh 11! * n thôi. Lúc in ra kết quả mình chưa kịp chớp mắt ấy chứ.
20p chắc em k làm nổi bài này hehe
drwpls
Nhìn bài thấy mệt luôn
Gửi từ buồn bằng vozFApp
geniusvlg
recursion là brute force, nếu mún optimize thì dùng Dynamic Programming
talaai1312_ver2
Đã tốn 20p google là không ra được đáp án / keyword "puzzle 123456789 hoặc math 123456789 hoặc inserting +/- 123456789"
Bác chủ thớt post cái cách giải lên được không?
linhlam2011997
Các thím luyện thuật toán bằng cách code nhiều bài à. Mình thì đang xem mấy bài trong khoá giải thuật của MIT trên youtube. Mà phần chính là lý thuyết giải quyết, k biết gặp bài toán code có ăn thua k nữa
+1 cho kỹ năng google của bạn. Code này chạy khá là đúng, chỉ bị sót trường hợp: -1+2-3+4+5+6+78+9 = 100. Ngoài ra thì người ta sẽ hỏi thêm nếu thêm dấu nhân, và chia thì code như thế nào nữa + giải thích code
tốt hơn có thể dùng qui hoạch động + một mảng các stack để lưu truy vết.
dựa vào đó đó thể in ra tất cả trường hợp thỏa mãn.
tthixk
Senior mà đi 90% pass bằng code challange thì rõ buồn cười. Đáng ra nó chỉ là vòng filter cv thôi.
T.Curly
E nghĩ senior thì sẽ hỏi cách giải quyết 1 vấn đề thực tế trong công việc chứ nhỉ
Mấy cái này nên hỏi fresher hay junior ít kinh nghiệm thì hợp lý hơn, dựa vào cái này thì có thể đánh giá được tư duy logic cũng như tìm ra cách giải quyết của ứng viên
E nghĩ senior thì sẽ hỏi cách giải quyết 1 vấn đề thực tế trong công việc chứ nhỉ
Mấy cái này nên hỏi fresher hay junior ít kinh nghiệm thì hợp lý hơn, dựa vào cái này thì có thể đánh giá được tư duy logic cũng như tìm ra cách giải quyết của ứng viên
Dĩ nhiên là để đến được bài code này thì bạn đã trải qua những vòng trước đó để đánh giá các vấn đề khác =.='
FighterVn
có buộc phải dùng hết tất cả các số ko? Hay chỉ cần subset cũng đc?
brute force bậy cái
tìm
tất cả các combination có thể +/- lại thành 100
Code:
function yo(input, start = 100, result = []) {
if (start === 0) {
console.log(result.join(''));
}
for (let charAt = 0; charAt < input.length; charAt++) {
for (let offset = 1; offset <= (start + '').length; offset++) {
const sub = input.substr(charAt, offset);
const number = parseInt(sub, 10);
if (!number || sub.length < offset) {
continue;
}
const parts = input.split(sub);
const nextInput = parts.join('');
yo(nextInput, start - number, result.concat([`+${number}`]));
yo(nextInput, start + number, result.concat([`-${number}`]));
}
}
}
yo('123456789', 100);
cảnh báo: chạy hơi bị lâu do có quá nhiều combinations
Last edited:
o0o_Hikaru_o0o
mấy bác luyện dư vậy, dúng là 2k có khac
superheo2000
Bài của mình là
Input Coooovvvidd 19
Output Covid 19
Đề bài 15' .Chỉ dùng một dòng lệnh
Thực sự mình không có luyện thuật toán kiểu như này bao giờ, nhưng giờ biết mấy cty top tuyển kiểu này thì cũng nên luyện để tự tin nhận offer
Thế nên mới lập topic này để nhiều anh em đóng góp, cùng nhau tiến bộ. Biết đâu 1 ngày nào đó gg hay fb sẽ lập hẳn 1 tech lab ở VN như Sin như hiện tại
Wenger Arsene
nhìn chả hiểu gì, hồi xưa có học Pascal thấy code cũng khắm lọ, sau qua học Luật cho rồi
Tôi toàn vào leetcode bài nào khó quá thì vào xem lời giải ở discuss
Cái này vẫn hơn là người không bao giờ quan tâm đến giải thuật như mình =]] Bạn đọc lời giải thì vẫn hiểu code, vẫn biết giải thuật này nọ, vậy là có thu hoạch rồi.
MuA tHuY tInH
Có 1 bài à.
bongdem236
đọc đề thì biết là bf nhưng giờ bảo imp trong 20' thì chịu
Học 4.5 năm kỹ thuật phần mềm ra trường bỏ nghề tới giờ 1 năm rưỡi, đọc ko hiểu 1 cái gì
hollywood movies
mấy cai vòng này thường là vòng start, khởi động cho vui thôi.
trước vào pv 1 cty mỹ, nó cũng cho 1 loạt 5 bài online trên hackerrank, yêu cầu > 68% testcases passed.
làm passed 95%, mà vào pv vẫn tạch 1 cách bách nhục
mấy cai vòng này thường là vòng start, khởi động cho vui thôi.
trước vào pv 1 cty mỹ, nó cũng cho 1 loạt 5 bài online trên hackerrank, yêu cầu > 68% testcases passed.
làm passed 95%, mà vào pv vẫn tạch 1 cách bách nhục
kk, thì code cũng là 1 phần của bài phỏng vấn thôi mà, chứ đâu phải chạy code xong nhận ngay offer =.=' mỗi cty có process khác nhau nữa. Ví dụ cty này thì mỗi vòng đều có 1-2 bài. Thế nên mới cần thêm nhiều người chia sẻ để mở rộng kiến thức chứ.
rosario_1
Cách 1 brute force. Giữa 2 số liên tiếp là 1 trong 3 phép toán, duyệt tất 3^8 phép toán.
Đã tốn 20p google là không ra được đáp án / keyword "puzzle 123456789 hoặc math 123456789 hoặc inserting +/- 123456789"
Bác chủ thớt post cái cách giải lên được không?
Bác search thế chung chung quá, phải có keyword rõ ràng, em thường search ntn: "Đề" + "Đáp án" + "Loại"
skyfall
ko đệ quy thì dùng stack vì đệ quy cũng là dùng stack nhưng HĐH lo hộ
ông nào làm kiểu dynamic hoặc có cách dự đoán được thành bại thì giỏi quá
canh_1412
Mình nhớ mình phỏng vấn có câu thế này:
1: Check systax của các dấu []{} () có đúng hay không. Ví dụ "[[]()" là sai, "[[()]]" là đúng
2: Cho một chuỗi gồm , chữ ,số, số thập phân, hỗn sỗ(2/2/3). Trich hết tất cả số, số thập phân, phân số, hỗn số ra.
3: Xoay vòng mảng k lần ví dụ: [1,2,3], xoay 1 lần: (2,3,1), xoay 2 lân (3,1,2)
Tạm thời nhớ nhiêu đó.
chiplovez
Bây giờ bảo mình tự code mấy cái thuật toán sắp xếp cũng chịu
(
E nghĩ senior thì sẽ hỏi cách giải quyết 1 vấn đề thực tế trong công việc chứ nhỉ
Mấy cái này nên hỏi fresher hay junior ít kinh nghiệm thì hợp lý hơn, dựa vào cái này thì có thể đánh giá được tư duy logic cũng như tìm ra cách giải quyết của ứng viên
Tuyển SA nè :v
DragonSlayer
mình thì tụi nó gửi bài trên codility 4 bài 2 tiếng có check performance
Fire Of Heart
Ủa thế bài này là xếp lộn xộn hay đúng thứ tự có sẵn vậy?
Tôi đọc lời giải vẫn thấy ko make sense lắm....
BadCoder
Leetcode em thấy test chặt hơn hacker rank kbac ạ.
Dr.Xylitol
You are given several lists of integers. The integers in each list are non-increasing from the list head to the list tail (so the largest value in a list will always be at the head, and the smallest at the tail).
You may assume every list contains at least one integer. A list may contain duplicate entries.
You are asked to build a sum by picking one integer from each list.
Find the n largest sums amongst all the combinations of picking an integer from each list, where n is some positive value.
For example if n is 1, then you are simply expected to find the sum that can be created by adding together the highest integers in all the lists.
If there are not n largest sums available (i.e. n is larger than the number of combinations of all list entries), you should return as many sums as possible.
In any case, the result may contain duplicate entries. Implement the following method that accepts these lists and a positive integer parameter n, and returns the n largest sums found in non-increasing order (i.e. largest sum returned first).
List findHighestSums(int[][] lists, int n) { }
For example, given the lists:
[5,4,3,2,1]
[4,1]
[5,0,0]
[6,4,2]
[1]
and a value of 5 for n, your procedure should return a List of size 5:
[21,20,19,19,18]
Bài tuyển sinh viên mới ra trường ngày xưa của mềnh. Dùng đệ quy và tạch ngay lập tức :v
BadCoder
Bài tập thì có khá nhiều trang rồi, đợt dịch em tính cày cuốc leetcode vs hacker rank... Chứ codeforce theo hơi hướng CP quá.
Còn các bác thì sao... Có review thêm trang nào bổ ích nữa ko???
Về lý thuyết học chỗ nào... Em tính đọc 2 cuốn là grooking algo với CTCI ... Algo học từ đh đó giờ quên sạch
Bài tập thì có khá nhiều trang rồi, đợt dịch em tính cày cuốc leetcode vs hacker rank... Chứ codeforce theo hơi hướng CP quá.
Còn các bác thì sao... Có review thêm trang nào bổ ích nữa ko???
Về lý thuyết học chỗ nào... Em tính đọc 2 cuốn là grooking algo với CTCI ... Algo học từ đh đó giờ quên sạch
Dev thường thì cày hết medium leetcode là quá ổn rồi, mấy bài hard ko bao giờ nó hỏi, vì quá khó nếu muốn giải trong 1-2h phỏng vấn. Lý thuyết thì đụng đâu học đó, giải ko ra thì coi keyword algorithm rồi mò giải lại thôi.
kai_nk
em đang dùng codelearn bên fpt thấy cũng ổn phết
kèm đó là nó có dạy thêm mấy khoá thuật toán các kiểu
Bài tập thì có khá nhiều trang rồi, đợt dịch em tính cày cuốc leetcode vs hacker rank... Chứ codeforce theo hơi hướng CP quá.
Còn các bác thì sao... Có review thêm trang nào bổ ích nữa ko???
Về lý thuyết học chỗ nào... Em tính đọc 2 cuốn là grooking algo với CTCI ... Algo học từ đh đó giờ quên sạch
Thích dùng leet code vì nó bắt buộc pass 100% test case, với lại nó cho kết quả so sánh tốc độ và memory so với các bài giải của bọn khác, và cảm giác nó gọn nhẹ.
Nên tập trung giải bài medium, được like nhiều ít dislike, cố gắng ít nhất tự giải được dù cùi bắp trước khi xem phần chia sẻ của bọn khác.
Cố gắng tổng 2 cái speed và memory trên 160 là ổn (nghĩa là mỗi cái nó cho biết đang tốt hơn bao nhiêu phần trăm ấy)
Tháng trước mình có làm bài test ứng tuyển Software Engineer của 1 cty như này :
cho 1 dãy số rồi chuyển thành chữ (<9 số)
ví dụ : 105234567 -> một trăm linh năm triệu hai trăm ba mươi tư nghìn năm trăm sáu mươi bảy
Mình có pass bài test, rồi đi phỏng vấn chuyên môn, rồi vòng sau phỏng vấn với giám đốc xong về nhận mail báo tạch
)))
Hơi tiếc vì công ty đó khá tốt.
Tháng trước mình có làm bài test ứng tuyển Software Engineer của 1 cty như này :
cho 1 dãy số rồi chuyển thành chữ (<9 số)
ví dụ : 105234567 -> một trăm linh năm triệu hai trăm ba mươi tư nghìn năm trăm sáu mươi bảy
Mình có pass bài test, rồi đi phỏng vấn chuyên môn, rồi vòng sau phỏng vấn với giám đốc xong về nhận mail báo tạch
)))
Hơi tiếc vì công ty đó khá tốt.
Chia buồn cùng bạn. Cố gắng thêm thôi
Các công ty đa số đều rất cần người, trừ khi vị trí đó dễ tuyển quá nên cân đo đong đếm được. Chứ những vị trí mà pv cả trăm người được 1 thì mừng như bắt được vàng vậy.
phuong-truong
Mấy bài này dễ mấy ông google phát là ra thôi. Chứ tôi biết tỉ lệ pass hackerrank, với mức độ medium thì thường dưới 3%. Có những bài medium mức độ có điẻm chỉ tầm 1/1000. Đừng hỏi tại sao tôi biết. TRước tôi làm ở cty cạnh tranh trực tiếp với HR ở mạng này.
Vì mấy bài trên HR thì không có bài giải hoặc bài tương tự. Ở mỹ tỷ lệ cũng xêm xêm với các quốc gia khác. Mức độ Hard trên HR thì tỉ lệ thấp còn kinh dị nữa.
Cho nên mấy dạng chơi algo này, không phải dân competive, thì tạch hết. Mà làm gì có thằng nào chơi cái này mà không google. Đa phần google 1 phát là ra hết. Chỉ có mấy thằng làm nghiêm túc về giải thuật này, thì nó lấy bài mới ra hàng tuần của HR cho ứng viên giải. Mấy bài này thì đảm bảo là không bao giờ tìm thấy qua google.
tangkiemandao
Cty hiênj tại mình làm thì thiết kế hệ thống crawl data và import. Chứ không test giải thuật.
anhsayvimen
In ra 1 tam giác cân bằng for. Mình viết thế này mà thằng pv nó ko chịu.
for (int i =0 ; i <1; ++i)
{
printf(" * ");
printf(" ** ");
printf(" *** ");
printf(" **** ");
printf("*****");
}
Bài test bên mình khá nhẹ nhàng:
B1: is string đối xứng?
B2: xoay mảng vuông
Cuuthanhvienvoz
sợ vl mới học c được 3 hôm vẽ được mấy cái hình bằng for thôi đã nghĩ mình vip vl
đm nhìn cái đề xong không biết có học nổi không
Legion
Sắp phỏng vấn intern front-end mà nó hỏi vầy chắc tạch cmnl
papuros
Hôm bữa có đi pv 1 cty về embedded:
1. các câu hỏi về C (bitwise operator, function pointer, etc.)
2. thiết kế 1 linked-list, thêm, xóa phần tử
3. vẽ 1 hình kim cương, ví dụ :
n=1:
*
n=3:
*
***
*
Thời gian là 1h cho tất cả, cũng ko quá khó khăn nhưng mình đã từ chối offer
Cái bài toán này đưa số liệu rất nửa mùa thì làm sao mà design?
Muốn tính toán xử lí được 6000 Concurent request mà ko đưa cấu hình server? bao nhiêu Ram, CPU GPU như nào? bao nhiêu core để ước lượng bài toán về performance. 6000 cũng ko phải con số lớn lắm. CCU chỉ có thể đo khi có codebase rồi đo chứ ai lại làm ngược lại là design một system 6000 CCU trước rồi mới code?
Còn thông số về 300 connection per database rất nửa mùa, muốn nó nhanh thì có ai connect trực tiếp từ webserver tới database đâu mà cần 3 với 500.
The system must ensure consistency. Muốn ensure consistency thì performance sẽ giảm, hay là ý bài toán là eventually consistency?
Muốn ensure consistency, high availability, easily scalable thì chắc ko thằng nào design được
À còn thông số 3 server can be used as relational database này nữa, khó hiểu quá
chắc bài toán design của Fsoft quá
đưa câu hỏi này với mình chắc mình hỏi lại thằng phỏng vấn tới lúc về cho nó trả lời luôn quá
sj3ub0y
Mấy cái thuật toán này toàn cao thủ mới học nhỉ, thằng bạn em làm front end lương hơn 1k mà em khẳng định mấy cái này nếu ko gg thì có cho cả năm cũng ko giải nổi
BaronNashor
Mấy thím có giải được medium, hard trên leetcode không
Trước đây thì có hình thức assignment , code tầm 3-4h, deadline 1-3 ngày, và làm ở nhà, nhưng tốn thời gian quá nên dần dần bị đào thải. Vừa rồi mới biết là dạo này nhiều cty chuộng cách phỏng vấn bằng CodePair, đề bài sẽ là 1 bài toán nho nhỏ, thường code tầm dưới 20 dòng, trong vòng 20 phút đổ lại. Code chạy được thì 90% là pass vòng đó rồi, nên có thể nói đây là 1 phần rất quan trọng của bài phỏng vấn.
Đây là bài toán của mình:
- input: "123456789", phép toán: cộng, trừ
- output: biểu thức có kết quả là 100. Ví dụ: 78+9+6+5+4-3+2-1=100
Bonus thông tin về vị trí này:
- Vị trí: Senior front-end
- Range: over 2k
-4 rounds (2 tech rounds)
- Office: HCM (cty Sin)
Mình thấy code mà trên dưới 20 dòng thì là đang xét mã giả thì đúng hơn, giống như bác nói có ngôn ngữ nó support đầy đủ hàm, có ngôn ngữ phải implement từ đầu thì sao mà 20 dòng chung chung đc
Chia buồn cùng bạn. Cố gắng thêm thôi
Các công ty đa số đều rất cần người, trừ khi vị trí đó dễ tuyển quá nên cân đo đong đếm được. Chứ những vị trí mà pv cả trăm người được 1 thì mừng như bắt được vàng vậy.
Tại khả năng của mình kém thôi fen
cứ ngỡ pass vòng pv chuyên môn là done rồi, ai ngờ pv vòng sau thì tạch =) coi như là k có duyên
rosario_1
Èo + - được phép xuất hiện trước số 1 à. Solution của tớ là + - phải sau số 1 nhé, đây là kết quả
123-45-67+89
12-3-4+5-6+7+89
12+3+4+5-6-7+89
123+4-5+67-89
1+2+3-4+5+6+78+9
12+3-4+5+67+8+9
1+23-4+56+7+8+9
1+2+34-5+67-8+9
1+23-4+5+6+78-9
123+45-67+8-9
123-4-5-6-7+8-9
Tớ code C#, Brute Force không đệ quy. Nếu thích sửa +- cả ở đằng trước hay thêm cả phép nhân thì về cơ bản vẫn thế sửa 1 tí là ok.
namespace ConsoleApp4
{
class Program
{
public class Solution
{
public List<string> GetDesireNumber(int n)
{
var result = new List<string>();
var numOfBrute = Math.Pow(3, 8);
for (long i = 0; i < numOfBrute; i++)
{
var kvp = Compute(i);
if (kvp.Value == n)
{
result.Add(kvp.Key);
}
}
return result;
}
private KeyValuePair<string, long> Compute(long i)
{
var key = new StringBuilder("1");
long resultValue = 0;
for (int j = 2; j <= 9; j++)
{
switch (i % 3)
{
case 0:
key.Append(j);
break;
case 1:
key.Append("+").Append(j);
break;
default:
key.Append("-").Append(j);
break;
}
i = i / 3;
}
var resultKey = key.ToString();
var sep = new char[] { '+', '-' };
var numStringArray = resultKey.Split(sep);
var numCount = numStringArray.Length;
resultValue = Int64.Parse(numStringArray[0]);
if (numStringArray.Length > 1)
{
for (int j = 1; j < numStringArray.Length; j++)
{
var currentValue= Int64.Parse(numStringArray[j]);
var index = 0;
for (int k = 0; k < j; k++)
index += (numStringArray[k].Length + 1);
if (resultKey[index - 1] == '+')
resultValue += currentValue;
else resultValue -= currentValue;
}
}
var result = new KeyValuePair<string, long>(resultKey, resultValue);
return result;
}
}
static void Main(string[] args)
{
var s = new Solution();
var result = s.GetDesireNumber(100);
foreach (var re in result)
Console.WriteLine(re);
Console.ReadLine();
}
}
}
Mình thấy code mà trên dưới 20 dòng thì là đang xét mã giả thì đúng hơn, giống như bác nói có ngôn ngữ nó support đầy đủ hàm, có ngôn ngữ phải implement từ đầu thì sao mà 20 dòng chung chung đc
Bạn xem có code mình up đó, javascript. 20 dòng là tương đối thôi bạn, lỡ cty nào khó n. Bạn có thể chọn bất cứ ngôn ngữ nào.
Èo + - được phép xuất hiện trước số 1 à. Solution của tớ là + - phải sau số 1 nhé, đây là kết quả
123-45-67+89
12-3-4+5-6+7+89
12+3+4+5-6-7+89
123+4-5+67-89
1+2+3-4+5+6+78+9
12+3-4+5+67+8+9
1+23-4+56+7+8+9
1+2+34-5+67-8+9
1+23-4+5+6+78-9
123+45-67+8-9
123-4-5-6-7+8-9
Tớ code C#, Brute Force không đệ quy. Nếu thích sửa +- cả ở đằng trước hay thêm cả phép nhân thì về cơ bản vẫn thế sửa 1 tí là ok.
namespace ConsoleApp4
{
class Program
{
public class Solution
{
public List<string> GetDesireNumber(int n)
{
var result = new List<string>();
var numOfBrute = Math.Pow(3, 8);
for (long i = 0; i < numOfBrute; i++)
{
var kvp = Compute(i);
if (kvp.Value == n)
{
result.Add(kvp.Key);
}
}
return result;
}
private KeyValuePair<string, long> Compute(long i)
{
var key = new StringBuilder("1");
long resultValue = 0;
for (int j = 2; j <= 9; j++)
{
switch (i % 3)
{
case 0:
key.Append(j);
break;
case 1:
key.Append("+").Append(j);
break;
default:
key.Append("-").Append(j);
break;
}
i = i / 3;
}
var resultKey = key.ToString();
var sep = new char[] { '+', '-' };
var numStringArray = resultKey.Split(sep);
var numCount = numStringArray.Length;
resultValue = Int64.Parse(numStringArray[0]);
if (numStringArray.Length > 1)
{
for (int j = 1; j < numStringArray.Length; j++)
{
var currentValue= Int64.Parse(numStringArray[j]);
var index = 0;
for (int k = 0; k < j; k++)
index += (numStringArray[k].Length + 1);
if (resultKey[index - 1] == '+')
resultValue += currentValue;
else resultValue -= currentValue;
}
}
var result = new KeyValuePair<string, long>(resultKey, resultValue);
return result;
}
}
static void Main(string[] args)
{
var s = new Solution();
var result = s.GetDesireNumber(100);
foreach (var re in result)
Console.WriteLine(re);
Console.ReadLine();
}
}
}
Bạn chụp hình code trong VS, rồi chụp output là được rồi bạn. Chứ code này để đây ai chạy, lại khó xem nữa, cũng chẳng biết đúng sai luôn =]]
Bạn có thể cho mình xin tên công ty được không? Hứa pv xong dù đậu hay rớt cũng không nhận offer. Thật ra thì rớt cũng không nhận được nhưng mà mình phỏng vấn vì đam mê là chính. Với lại max offer có được 3k không nhỉ?
Cty này sau mình là hết tuyển thêm rồi bạn. Nếu bạn làm Java hay Go thì còn tuyển ak. Nếu bạn muốn phỏng vấn vì đam mê thì connect với headhunter nha, hoặc bạn có profile linkedin ổn thì ngta mời bạn phỏng vấn còn chối không kịp ấy chứ.
Bạn xem có code mình up đó, javascript. 20 dòng là tương đối thôi bạn, lỡ cty nào khó n. Bạn có thể chọn bất cứ ngôn ngữ nào.
Bạn chụp hình code trong VS, rồi chụp output là được rồi bạn. Chứ code này để đây ai chạy, lại khó xem nữa, cũng chẳng biết đúng sai luôn =]]
Nếu ko copy code ra khó xem lắm, làm thế này để ai thích thì có thể copy code lên visual studio chạy thì dễ theo dõi hơn. Output mình đã list ra phía trên rồi mà.
Cty này sau mình là hết tuyển thêm rồi bạn. Nếu bạn làm Java hay Go thì còn tuyển ak. Nếu bạn muốn phỏng vấn vì đam mê thì connect với headhunter nha, hoặc bạn có profile linkedin ổn thì ngta mời bạn phỏng vấn còn chối không kịp ấy chứ.
Ừ mình cũng có pv nhiều. Ít ra bọn cho tên công ty để mình liên hệ HR hoặc headhunter gì đó chứ.
Ok qua trao đổi sơ lược với hh thì mình nghĩ là đoán được công ty nào rồi. Trước mình đã đi pv, offer ~2k5 (không biết giờ sao), mình thì thích qua Sing làm hơn mà họ không offer vị trí bên Sing nên từ chối.
Kk, qua sin giờ hơi khó rồi. Mình thì thích ở vn cho khỏe. Nhiều job UK, AUS bên headhunter vẫn có đó, nhưng có vẻ cực vl. Thêm dịch này nữa thì càng toang.
Bạn có thể cho mình xin tên công ty được không? Hứa pv xong dù đậu hay rớt cũng không nhận offer. Thật ra thì rớt cũng không nhận được nhưng mà mình phỏng vấn vì đam mê là chính. Với lại max offer có được 3k không nhỉ?
Sao lại phải hứa với không hứa, bạn apply trúng muốn làm thì cứ làm thôi, có ai cản bạn đâu : )).
Muốn apply bên Sing thì bạn liên hệ thẳng với HR bên Sing hoặc kiếm refer thôi, contact HR VN làm gì.
Bài tuyển sinh viên mới ra trường ngày xưa của mềnh. Dùng đệ quy và tạch ngay lập tức :v
tốt hon đệ qui chắc dùng một max heap, đpt O(max(n, maxlength)Llog(maxlength)) với L là số list.
xét 2 list đầu tiên(gọi là A và B), tạo 1 list có n số to nhất từ tổn các ptử 2 list đó bằng cách đưa A[0] + B[0], A[0]+B[1],...,A[0]+B[độ dài B -1].
lặp n lần, mỗi lần lấy 1 ptử trong heap ra, thêm vào list kết quả hiện tại, cộng vị trí trong A thêm 1 , cộng lại ví trí B rồi push ngược lại heap.
xong n lần lặp thì cho A= list kết quả, B = list tiếp theo, lặp lại như trên đến hết qu list và xuất list kết quả
tốt hon đệ qui chắc dùng một max heap, đpt O(nLlog(maxlength)) với L là số list.
xét 2 list đầu tiên(gọi là A và B), tạo 1 list có n số to nhất từ tổn các ptử 2 list đó bằng cách đưa A[0] + B[0], A[0]+B[1],...,A[0]+B[độ dài B -1].
lặp n lần, mỗi lần lấy 1 ptử trong heap ra, thêm vào list kết quả hiện tại, cộng vị trí trong A thêm 1 , cộng lại ví trí B rồi push ngược lại heap.
xong n lần lặp thì cho A= list kết quả, B = list tiếp theo, lặp lại như trên đến hết qu list và xuất list kết quả
Không hiểu đoạn này, tức là mỗi lần lặp bạn push bao nhiêu phần tử vào heap?
cộng vị trí trong A thêm 1 , cộng lại ví trí B rồi push ngược lại heap.
tốt hon đệ qui chắc dùng một max heap, đpt O(nLlog(maxlength)) với L là số list.
xét 2 list đầu tiên(gọi là A và B), tạo 1 list có n số to nhất từ tổn các ptử 2 list đó bằng cách đưa A[0] + B[0], A[0]+B[1],...,A[0]+B[độ dài B -1].
lặp n lần, mỗi lần lấy 1 ptử trong heap ra, thêm vào list kết quả hiện tại, cộng vị trí trong A thêm 1 , cộng lại ví trí B rồi push ngược lại heap.
xong n lần lặp thì cho A= list kết quả, B = list tiếp theo, lặp lại như trên đến hết qu list và xuất list kết quả
Hiểu chết liền. Post code demo lên cho nhanh bạn ơi, cá nhân tớ phải debug có lẽ mới có thể hiểu được ý tưởng của bạn.
Có bạn bảo dùng Dynamic Programming thì định dùng như thế nào? Hiện tại coi như tớ có dùng DP thì cũng chỉ để thay vì trước đây với mỗi vòng lặp, phép tính xuất hiện đủ 9 số từ 1 đến 9, gọi là P(9) thì giờ P(9) sẽ được tính gián tiếp = P(8)+9, P(8)-9 hoặc P(x) + hoặc - (x+1)(x+2)...89 Mà làm thế tớ thấy nếu chỉ để hạ số lượng phần tử tham gia vào phép tính từ 9 xuống 1 con số nhỏ hơn nói thật chẳng giải quyết được cái gì mà lại còn tốn chỗ lưu các giá trị tính toán trước đấy, thế thì đệ quy cmn luôn cho nhanh. Chứ độ phức tạp vẫn thế, to đùng ngã ngửa, hàm lũy thừa.
Các bạn có ý tưởng gì giảm được độ phức tạp xuống thì cố gắng cụ thể hóa ý tưởng = code đi, let the code talk.
Hiểu chết liền. Post code demo lên cho nhanh bạn ơi, cá nhân tớ phải debug có lẽ mới có thể hiểu được ý tưởng của bạn.
Có bạn bảo dùng Dynamic Programming thì định dùng như thế nào? Hiện tại coi như tớ có dùng DP thì cũng chỉ để thay vì trước đây với mỗi vòng lặp, phép tính xuất hiện đủ 9 số từ 1 đến 9, gọi là P(9) thì giờ P(9) sẽ được tính gián tiếp = P(8)+9, P(8)-9 hoặc P(x) + hoặc - (x+1)(x+2)...89 Mà làm thế tớ thấy nếu chỉ để hạ số lượng phần tử tham gia vào phép tính từ 9 xuống 1 con số nhỏ hơn nói thật chẳng giải quyết được cái gì mà lại còn tốn chỗ lưu các giá trị tính toán trước đấy, thế thì đệ quy cmn luôn cho nhanh. Chứ độ phức tạp vẫn thế, to đùng ngã ngửa, hàm lũy thừa.
Các bạn có ý tưởng gì giảm được độ phức tạp xuống thì cố gắng cụ thể hóa ý tưởng = code đi, let the code talk.
hình như thím nhầm bài rồi
đang nói bài của bác mình quote mà
mà cái bài của chủ thớt nếu dùng DP trong bài nay phải liệt kê thì cũng như đệ qui thôi.
Last edited:
Giam Doc EVN
Thớt hay, mình cũng thỉnh thoảng lên giải mấy bài problem solving trên Hackerrank. Để khi nào rảnh post mấy bài trên này cho mấy thím thảo luận chơi
KBGLTB
Bài của chủ thớt dùng đệ quy em thua. Hôm qua giờ không nghĩ ra được cách để dùng đệ quy. Bài này em dùng DP để giải kết quả có vẻ giống.
tốt hon đệ qui chắc dùng một max heap, đpt O(max(n, maxlength)Llog(maxlength)) với L là số list.
xét 2 list đầu tiên(gọi là A và B), tạo 1 list có n số to nhất từ tổn các ptử 2 list đó bằng cách đưa A[0] + B[0], A[0]+B[1],...,A[0]+B[độ dài B -1].
lặp n lần, mỗi lần lấy 1 ptử trong heap ra, thêm vào list kết quả hiện tại, cộng vị trí trong A thêm 1 , cộng lại ví trí B rồi push ngược lại heap.
xong n lần lặp thì cho A= list kết quả, B = list tiếp theo, lặp lại như trên đến hết qu list và xuất list kết quả
uhm, chia để trị, mà hồi đó không nghĩ ra, dùng đệ quy tạo ra list kết quả xong sort lại lấy n phần tử to nhất haha.
q.push(Data(k.i + 1, k.j, lists[0][k.i + 1] + lists[k.j]));
Thế còn i, j+1 thì sao bạn?
Nếu là mình làm thì lúc đầu mình push (0, 0). Các case sau mỗi lần lấy ra (i, j) thì push (i+1, j) và (i, j+1).
không cần và không được push (i, j + 1), vì mỗi phần tử của B chỉ cần một phần tử của A, như thế sẽ giữ được heap luôn chỉ có < B.size() phần tử. ban đầu tòan bộ các phần tử của B được ứng với A[0], lấy ra được số lớn nhất là tổng từ A[0] với B[0]. rồi phần tử B được đưa ra được push trở lại với phần tử A tiếp theo để giảm tổng xuống.
làm như thím thì sẽ có trường hợp một cặp (i,j) được đưa vào heap nhiều lần và bị trùng, vì (i,j) đều có thể đi tới từ (i - 1, j) hoặc (i, j - 1).
không cần và không được push (i, j + 1), vì mỗi phần tử của B chỉ cần một phần tử của A, như thế sẽ giữ được heap luôn chỉ có < B.size() phần tử. ban đầu tòan bộ các phần tử của B được ứng với A[0], lấy ra được số lớn nhất là tổng từ A[0] với B[0]. rồi phần tử B được đưa ra được push trở lại với phần tử A tiếp theo để giảm tổng xuống.
làm như thím thì sẽ có trường hợp một cặp (i,j) được đưa vào heap nhiều lần và bị trùng, vì (i,j) đều có thể đi tới từ (i - 1, j) hoặc (i, j - 1).
Thuật toán của bác làm thế nào để giải quyết đc TH [[4,4,2,1], [4,4,4,1], [4,4,3,1]]?
không cần và không được push (i, j + 1), vì mỗi phần tử của B chỉ cần một phần tử của A, như thế sẽ giữ được heap luôn chỉ có < B.size() phần tử. ban đầu tòan bộ các phần tử của B được ứng với A[0], lấy ra được số lớn nhất là tổng từ A[0] với B[0]. rồi phần tử B được đưa ra được push trở lại với phần tử A tiếp theo để giảm tổng xuống.
làm như thím thì sẽ có trường hợp một cặp (i,j) được đưa vào heap nhiều lần và bị trùng, vì (i,j) đều có thể đi tới từ (i - 1, j) hoặc (i, j - 1).
Nãy em ngẫm lại và xoá bài rồi bác
.
Nói chung cách của bác là đúng rồi. Có thể tối ưu thêm một chút nhưng không đáng kể lắm.
Thuật toán của bác làm thế nào để giải quyết đc TH [[4,4,2,1], [4,4,4,1], [4,4,3,1]]?
có code đó thím, thim bỏ vào chạy thử xem
themen99
Topic hay đó
Shit_In_A_Bitch
có trang khá hay nói về các câu hỏi của TOP 4 Silicon Valley. Bro nào có hứng thứ vào sign up.
Trả phí thì có solution thì phải
https://www.techseries.dev/daily
Vòng 1:
- Bài 1: Kiểm tra một chuỗi dãy ngoặc là hợp lệ, 3 loại ngoặc [({.
- Bài 2: Tìm số lớn thứ k trong mảng chưa sắp xếp, cài đặt tối ưu sao cho độ phức tạp tính toán nhỏ nhất, không dùng thư viện. Bài này mình cài heap (
make_heap,
pop_heap), chưa fix bug xong nhưng vẫn pass vòng này.
Vòng 2: Sắp xếp trên danh sách liên kết đơn. Mình cài selection sort, sau đó được yêu cầu cải tiến thì mình cài merge sort.
Vòng 1:
- Bài 1: Kiểm tra một chuỗi dãy ngoặc là hợp lệ, 3 loại ngoặc [({.
- Bài 2: Tìm số lớn thứ k trong mảng chưa sắp xếp, cài đặt tối ưu sao cho độ phức tạp tính toán nhỏ nhất, không dùng thư viện. Bài này mình cài heap (
make_heap,
pop_heap), chưa fix bug xong nhưng vẫn pass vòng này.
Vòng 2: Sắp xếp trên danh sách liên kết đơn. Mình cài selection sort, sau đó được yêu cầu cải tiến thì mình cài merge sort.
Vậy thì phải tìm hiểu nguyên nhân tại sao chưa nuốt nổi? Vì ngôn ngữ đọc không hiểu, hay không hiểu giải thuật? Lời giải thớt đã đưa rồi mà, cơ sở giải thuật chỉ đơn giản tính P(9,100) = tất cả P(x, 100+- (x+1)(x+2)...9) . (x+1)(x+2)...9 hiểu là 1 số tự nhiên được tạo thành bởi các chữ số (x+1)...9 viết liền nhau.
Nói chung tư duy đệ quy là trong sáng và ngắn gọn nhất trong lập trình. Nếu thích tối nay mà con ngủ sớm tớ có thể code 1 cách đệ quy khác cho vui cũng được
Vậy thì phải tìm hiểu nguyên nhân tại sao chưa nuốt nổi? Vì ngôn ngữ đọc không hiểu, hay không hiểu giải thuật? Lời giải thớt đã đưa rồi mà, cơ sở giải thuật chỉ đơn giản tính P(9,100) = tất cả P(x, 100+- (x+1)(x+2)...9) . (x+1)(x+2)...9 hiểu là 1 số tự nhiên được tạo thành bởi các chữ số (x+1)...9 viết liền nhau.
Nói chung tư duy đệ quy là trong sáng và ngắn gọn nhất trong lập trình. Nếu thích tối nay mà con ngủ sớm tớ có thể code 1 cách đệ quy khác cho vui cũng được
à mình không phải nói cái đề của thớt, mình chưa hiểu lắm về đệ quy với chưa làm nhiều với nó nên mình không nuốt nổi đó mà
có trang khá hay nói về các câu hỏi của TOP 4 Silicon Valley. Bro nào có hứng thứ vào sign up.
Trả phí thì có solution thì phải
https://www.techseries.dev/daily
Không nhé, từng có drama giữa jona, techlead với cộng sự cũ của họ - algoexpert. Xem cho vui, mua vui thì ok chứ mua của bọn nó thì...
.
Leetcode, geek4geek, techdelight, hackerank thiếu j chỗ có solution.
Dùng regex thì đúng rồi. Đề này là khi phỏng vấn gameloft
superheo2000
Thế làm bài nữa nha,
Input một mảng bất kì chưa sắp xếp
Tìm số lớn nhì của mảng. Chỉ dùng tối đa một dòng for.
input [1,4,5,6,3]
out 5
Đề khi phỏng vấn TMA
Thế làm bài nữa nha,
Input một mảng bất kì chưa sắp xếp, phần tử của mảng không trùng nhau.
Tìm số lớn nhì của mảng. Chỉ dùng tối đa một dòng for.
input [1,4,5,6,3]
out 5
Không dùng for có được ko?
print(sorted(test_input, reverse=True)[1])
Trường hợp: Có phần tử trùng nhau:
print(sorted(set(test_input), reverse=True)[1])
Trường hợp: Có phần tử trùng nhau:
print(sorted(set(test_input), reverse=True)[1])
Bài này dùng test giải thuật trên notepad nên sẽ không dùng hàm có sẵn.
Bác thích dùng hàm có sẵn thì giải thử bài này xem
Cho tập X gồm n phần tử bất kì (Nhập từ bàn phím)
Từ tập X tạo ra n tập con từ nó là X1 -> Xn (Nhập từ bàn phím)
Nhập vào tập Z. Kiểm tra Z có chứa tập con nào của X không, có thì trả về true.
Chỉ dùng một dòng loop duy nhất, cùng đề test đó luôn
input X = [01,1,10,2,3,4,5,6,7]
X1 = [1,2] , X2 = [3], X3 = [5,6,7]
Z = [01,10,1,5,6] output false
Z = [01,10,1,4,5,2] output true
Thế làm bài nữa nha,
Input một mảng bất kì chưa sắp xếp
Tìm số lớn nhì của mảng. Chỉ dùng tối đa một dòng for.
input [1,4,5,6,3]
out 5
Đề khi phỏng vấn TMA
Code:
function fuckSuperheo2000(array) {
let a = b = array[0];
for (let i = 1; i < array.length; i++) {
const c = array[i];
if (c > a) {
b = a;
a = c;
} else if (c > b) {
b = c;
}
}
console.log(a, b);
}
Bài này dùng test giải thuật trên notepad nên sẽ không dùng hàm có sẵn.
Bác thích dùng hàm có sẵn thì giải thử bài này xem
Cho tập X gồm n phần tử bất kì (Nhập từ bàn phím)
Từ tập X tạo ra n tập con từ nó là X1 -> Xn (Nhập từ bàn phím)
Nhập vào tập Z. Kiểm tra Z có chứa tập con nào của X không, có thì trả về true.
Chỉ dùng một dòng loop duy nhất, cùng đề test đó luôn
input X = [01,1,10,2,3,4,5,6,7]
X1 = [1,2] , X2 = [3], X3 = [5,6,7]
Z = [01,10,1,5,6] output false
Z = [01,10,1,4,5,2] output true
Nếu mảng không có ký tự trùng nhau thì mình dùng code này:
Bài này dùng test giải thuật trên notepad nên sẽ không dùng hàm có sẵn.
Bác thích dùng hàm có sẵn thì giải thử bài này xem
Cho tập X gồm n phần tử bất kì (Nhập từ bàn phím)
Từ tập X tạo ra n tập con từ nó là X1 -> Xn (Nhập từ bàn phím)
Nhập vào tập Z. Kiểm tra Z có chứa tập con nào của X không, có thì trả về true.
Chỉ dùng một dòng loop duy nhất, cùng đề test đó luôn
input X = [01,1,10,2,3,4,5,6,7]
X1 = [1,2] , X2 = [3], X3 = [5,6,7]
Z = [01,10,1,5,6] output false
Z = [01,10,1,4,5,2] output true
đề bài ngu hay mình ngu nhỉ? X gồm n phần từ mà tạo ra n tập con thì mỗi tập con có 1 phần tử thôi à?
Đề bài có thể rút gọn bỏ qua tập X đc ko? Chứ input output chả thấy liên quan gì tới tập X.
Không nhé, từng có drama giữa jona, techlead với cộng sự cũ của họ - algoexpert. Xem cho vui, mua vui thì ok chứ mua của bọn nó thì...
.
Leetcode, geek4geek, techdelight, hackerank thiếu j chỗ có solution.
Mình cũng có biết vụ này =], tụi reddit cũng chửi khá nhiều bọn này, nói là chỉ lấy nội dung từ quyển cracking coding interview thôi mà phí thì mắc vcl. Nhưng mà thằng joma xem youtube của nó cũng hài
) giải trí tốt
1: Check systax của các dấu []{} () có đúng hay không. Ví dụ "[[]()" là sai, "[[()]]" là đúng
JavaScript:
function checkSyntax(input) {
let stack = [];
const brackets = ['{}', '[]', '()'];
for (var c of input) {
var bracket = brackets.filter(x => x.indexOf(c) > -1)[0];
if (bracket[0] == c) {
stack.push(c);
continue;
}
var p = stack.pop();
if (p != bracket[0]) {
return false;
}
}
return stack.length == 0;
}
3: Xoay vòng mảng k lần ví dụ: [1,2,3], xoay 1 lần: (2,3,1), xoay 2 lân (3,1,2)
JavaScript:
function rotateArray(array, rotate){
var len = array.length;
var rotate = rotate % len;
var result = Array(len);
for(var i = 0; i < len; i++){
result[(i - rotate + len) % len] = array[i];
}
return result;
}
Vậy nên dùng thuật toán nào trong trường hợp này vậy bác?
Trong trường hợp mảng như ở trên thì nhiều người cho rằng Quicksort là tốt nhất, nhưng mình thấy độ phức tạp trong Average case cũng là O(n (logn)) rồi (tương đương với Timsort của sorted function).
Đề yêu cầu một vòng for thì bạn phía trên có giải rồi đó, là mở rộng của bài toán tìm max thôi. Sort thì bản chất là chạy vài lần vòng for rồi, nên không tối ưu.
Vậy nên dùng thuật toán nào trong trường hợp này vậy bác?
Trong trường hợp mảng như ở trên thì nhiều người cho rằng Quicksort là tốt nhất, nhưng mình thấy độ phức tạp trong Average case cũng là O(n (logn)) rồi (tương đương với Timsort của sorted function).
Thì cứ duyệt từ đầu đến cuối thôi thím ơi, tại thím thích phức tạp hóa vấn đề thôi
Tháng trước mình có làm bài test ứng tuyển Software Engineer của 1 cty như này :
cho 1 dãy số rồi chuyển thành chữ (<9 số)
ví dụ : 105234567 -> một trăm linh năm triệu hai trăm ba mươi tư nghìn năm trăm sáu mươi bảy
Mình có pass bài test, rồi đi phỏng vấn chuyên môn, rồi vòng sau phỏng vấn với giám đốc xong về nhận mail báo tạch
)))
Hơi tiếc vì công ty đó khá tốt.
Thời gian để thực hiện bài test là trong bao lâu vậy thím?
Thời gian để thực hiện bài test là trong bao lâu vậy thím?
Thường các bài coding test cho tầm 30 tới 45 phút nếu phỏng vấn trực tiếp.
Nãy bạn quote mình mà chưa kịp xem, vô xem đã thấy edit rồi, nhưng mình cứ bổ sung nhé.
Tìm số lớn nhất hoặc lớn nhì thì chỉ dùng vòng lặp đơn rồi lưu biến max hoặc max2 là được. Tổng quát lên tìm số lớn thứ k thì bạn dùng PriorityQueue nhé, đây là 1 câu hỏi trong vòng onsite của Facebook.
Bài của mình là
Input Coooovvvidd 19
Output Covid 19
Đề bài 15' .Chỉ dùng một dòng lệnh
Mình code nhanh nên hơi bừa
thông cảm
a = lambda s: print(''.join([s[0]] + [s[i + 1] for i in range(len(s) - 1) if s[ i] != s[i + 1]])) Lý do ko xài dict là vì lỡ gặp pv khắm lọ đổi thành coooronaa 19 thì có đường mà chơi
snowbellcat
phỏng vấn shopee singapore vòng 1 (mình đã tạch):
câu 1 dễ : ko dùng build in function viết hàm convert 1 số từ thập phân sang hexa
câu 2 khó hơn thì không nhớ đề bài
Trước đây thì có hình thức assignment , code tầm 3-4h, deadline 1-3 ngày, và làm ở nhà, nhưng tốn thời gian quá nên dần dần bị đào thải. Vừa rồi mới biết là dạo này nhiều cty chuộng cách phỏng vấn bằng CodePair, đề bài sẽ là 1 bài toán nho nhỏ, thường code tầm dưới 20 dòng, trong vòng 20 phút đổ lại. Code chạy được thì 90% là pass vòng đó rồi, nên có thể nói đây là 1 phần rất quan trọng của bài phỏng vấn.
Đây là bài toán của mình:
- input: "123456789", phép toán: cộng, trừ
- output: chèn phép toán cộng, trừ vào input string sao cho biểu thức có kết quả là 100.
Ví dụ: -1 + 2 - 3 + 4 + 5 + 6 + 78 + 9 (=100)
- Mở rộng thêm nếu có phép nhân và chia
Bonus thông tin về vị trí này:
- Vị trí: Senior front-end
- Range: over 2k
-4 rounds (2 tech rounds)
- Office: HCM (cty Sin)
Bạn nào từng gặp thì chia sẻ lên cho vui.
Bài cộng trừ mình nghĩ dùng Dynamic Programming - Distinct Ways pattern, may be
Bài check syntax mấy dấu ngoặc thì dùng 1 cái stack với 1 cái hashmap để iterate, hồi trước có làm trên LeetCode rồi
Bài rotate array thì chắc classical, phỏng vấn nào cũng gặp câu này nhỉ
Đây là ngôn ngữ gì bạn? Tất cả những thứ cần unique dùng set là 1 cách tiếp cận hiển nhiên đối với tớ, tuy nhiên tại sao lại đưa vào List rồi sort với join trong khi bản chất string về cơ bản chỉ như 1 Array
Code C#, 1 dòng, 1 phút.
Code:
public string GetUniqueString(string s)
{
return new string((new HashSet<char>(s.ToCharArray())).ToArray());
}
Đây là ngôn ngữ gì bạn? Tất cả những thứ cần unique dùng set là 1 cách tiếp cận hiển nhiên đối với tớ, tuy nhiên tại sao lại đưa vào List rồi sort với join trong khi bản chất string về cơ bản chỉ như 1 Array
Code C#, 1 dòng, 1 phút.
Code:
public string GetUniqueString(string s)
{
return new string((new HashSet<char>(s.ToCharArray())).ToArray());
}
Sử dụng python. Lí do đưa string về list là vì string trong python ko thể assign value tại 1 index được, ví dụ như s[0] = 'a' sẽ báo lỗi, nên thường biến nó về list trước, riết thành thói quen. Còn bài này thì đúng ko cần đưa về list, quen tay cứ dưa về list... Còn lí do phải join vì sau khi đưa về set vì phải join thì mới thành string được
Đây là ngôn ngữ gì bạn? Tất cả những thứ cần unique dùng set là 1 cách tiếp cận hiển nhiên đối với tớ, tuy nhiên tại sao lại đưa vào List rồi sort với join trong khi bản chất string về cơ bản chỉ như 1 Array
Code C#, 1 dòng, 1 phút.
Code:
public string GetUniqueString(string s)
{
return new string((new HashSet<char>(s.ToCharArray())).ToArray());
}
dùng hashset mà đổi đề thành cooorooona là oẳng đấy bác
Mình nhớ mình phỏng vấn có câu thế này:
1: Check systax của các dấu []{} () có đúng hay không. Ví dụ "[[]()" là sai, "[[()]]" là đúng
2: Cho một chuỗi gồm , chữ ,số, số thập phân, hỗn sỗ(2/2/3). Trich hết tất cả số, số thập phân, phân số, hỗn số ra.
3: Xoay vòng mảng k lần ví dụ: [1,2,3], xoay 1 lần: (2,3,1), xoay 2 lân (3,1,2)
Tạm thời nhớ nhiêu đó.
cái này tôi làm regex có đc ko hay phải code :sexy:
Java bài 1:
boolean checkSyntax(String s) {
String result = s;
Pattern a = Pattern.compile("{[^{]*?}");
Pattern b = Pattern.compile("\[[^\[{}\]*?\]");
Pattern c = Pattern.compile("\([^\({}\[\]]*?\)");
result = c.matcher(result).replaceAll("");
if (result.indexOf("(") ! = -1 || result.indexOf(")") != -1) return false;
result = b.matcher(result).replaceAll("");
if (result.indexOf("[") ! = -1 || result.indexOf("]") != -1) return false;
result = a.matcher(result).replaceAll("");
if (result.indexOf("{") ! = -1 || result.indexOf("}") != -1) return false;
return true;
}
Java Bài 2:
String getNumbers(String s){
Pattern a = Pattern.complie("([\d]+\/[^\/][\d]+\/[^\/][\d]+)|[\d]+\/[\d]+|[\d]+\.[\d]+|[\d]+");
Matcher m = a.matcher(s);
return a.group();
}
Java Bài 3:
void rotateArray(int[] array, int rotate){
for (int i =0; i < array.length;i++)
int index = Math.abs(rotate-1+i) % array.length;
System.out.print(array[index]);
}
nếu sai cú pháp thì bác thông cảm nhé
dùng hashset mà đổi đề thành cooorooona là oẳng đấy bác
Đầu tiên yêu cầu về Input, Output của bạn phải clear. Cooroona hay cái gì thì nó phải đưa vào điều kiện output, tức là phải define pattern của output ngay từ đầu, ko nói chơi chơi thế được. Bao giờ nó đổi hẵng tính tiếp. Bạn nên biết performance của regex rất không tốt. Còn với điều kiện ban đầu mà nói, tớ khẳng định luôn code của tớ là best performance, chắc chỉ thua print "Covid 19" mẹo vặt 10 con rồng đất Trạng Quỳnh thôi.
Đầu tiên yêu cầu về Input, Output của bạn phải clear. Cooroona hay cái gì thì nó phải đưa vào điều kiện output, tức là phải define pattern của output ngay từ đầu, ko nói chơi chơi thế được. Bao giờ nó đổi hẵng tính tiếp. Bạn nên biết performance của regex rất không tốt. Còn với điều kiện ban đầu mà nói, tớ khẳng định luôn code của tớ là best performance, chắc chỉ thua print "Covid 19" mẹo vặt 10 con rồng đất Trạng Quỳnh thôi.
Dùng HashSet thì làm sao mà best performance được nhỉ? Hơn nữa lại chuyển qua array, rồi mới tạo string.
Mà cái hàm toArray của HashSet maintain được thứ tự insert vào set à? Hay nhỉ, mình không dùng C# nên không rành. Bên Java thì HashSet không đảm bảo được cái order này.
Thế làm bài nữa nha,
Input một mảng bất kì chưa sắp xếp
Tìm số lớn nhì của mảng. Chỉ dùng tối đa một dòng for.
input [1,4,5,6,3]
out 5
Đề khi phỏng vấn TMA
Đọc không hiểu logic của bạn lắm.
Xét 2 số liên tiếp, nếu số trước nhỏ hơn số sau thì swap. Nếu bằng nhau thì gán số sau = 0.
Đáp án là số thứ 2 của dãy?
Nếu số lớn thứ 2 của dãy là numbers[1], bạn swap với phần tử 0 rồi đưa ra đáp án numbers[1] là thấy sai luôn rồi.
Bài này dùng test giải thuật trên notepad nên sẽ không dùng hàm có sẵn.
Bác thích dùng hàm có sẵn thì giải thử bài này xem
Cho tập X gồm n phần tử bất kì (Nhập từ bàn phím)
Từ tập X tạo ra n tập con từ nó là X1 -> Xn (Nhập từ bàn phím)
Nhập vào tập Z. Kiểm tra Z có chứa tập con nào của X không, có thì trả về true.
Chỉ dùng một dòng loop duy nhất, cùng đề test đó luôn
input X = [01,1,10,2,3,4,5,6,7]
X1 = [1,2] , X2 = [3], X3 = [5,6,7]
Z = [01,10,1,5,6] output false
Z = [01,10,1,4,5,2] output true
Java:
boolean containSubList(List<Int> Z){
for (List<int> list : XLists)
if(!Z.containAll(list)) return false;
return true;
}
Đọc không hiểu logic của bạn lắm.
Xét 2 số liên tiếp, nếu số trước nhỏ hơn số sau thì swap. Nếu bằng nhau thì gán số sau = 0.
Đáp án là số thứ 2 của dãy?
Nếu số lớn thứ 2 của dãy là numbers[1], bạn swap với phần tử 0 rồi đưa ra đáp án numbers[1] là thấy sai luôn rồi.
tôi ngáo đó ông :v
int secondHighest(int[] numbers){
int b = numbers [0]; int count = 0; for (int i=0;i<numbers.length-1;i++){
int a= numbers [i ]
;
if(numbers [i ] > numbers[i+1]){ if (count == 0) b = numbers[i+1]; if(b < numbers[i+1]) b = numbers[i+1]; numbers [i ] = numbers[i+1]; numbers [i+1] = a; count++; }
tôi ngáo đó ông :v
int secondHighest(int[] numbers){
int b = numbers [0]; int count = 0; for (int i=0;i<numbers.length-1;i++){
int a= numbers [i ]
;
if(numbers [i ] > numbers[i+1]){ if (count == 0) b = numbers[i+1]; if(b < numbers[i+1]) b = numbers[i+1]; numbers [i ] = numbers[i+1]; numbers [i+1] = a; count++; }
} return b; }
Code ngáo đá vãi,
đặt biến, swap loạn xạ. ko hiểu logic là gì. Test với case cơ bản {0,1,2} thì in ra 0. Chán
botmingoc
Tìm 2nd largest (kth largest) in an array:
1. Naive solution: sort array rồi in k-th -> time O(long)
Có thể improve không: nhận thấy ko cần cả cả input in order, chỉ cần k phần tử lớn nhất.
2. min heap: tạo min heap , travel array, add vào heap. nếu size heap > k thì pop out.result là phần tử đứng đầu heap sau khi travel
Có thể improve ko: nhận thấy ko cần k phần tử lớn nhất, chỉ cần tìm thằng k-th lớn nhất. Ví dụ dãy là 1 2 3 4 5 , k =3
thì chỉ cần biết 3 là thằng lớn thứ 3, ko care thứ tự 4 5 hay 5 4
=>
Cách thứ 3: quick sort. Pick pivot, nếu pivot > k -> tìm trong khoảng từ pivot tới k. Nếu pivot = k -> kết quả. Nếu pivot < k -> tìm bên trái.
Tìm 2nd largest (kth largest) in an array:
1. Naive solution: sort array rồi in k-th -> time O(long)
Có thể improve không: nhận thấy ko cần cả cả input in order, chỉ cần k phần tử lớn nhất.
2. min heap: tạo min heap , travel array, add vào heap. nếu size heap > k thì pop out.result là phần tử đứng đầu heap sau khi travel
Có thể improve ko: nhận thấy ko cần k phần tử lớn nhất, chỉ cần tìm thằng k-th lớn nhất. Ví dụ dãy là 1 2 3 4 5 , k =3
thì chỉ cần biết 3 là thằng lớn thứ 3, ko care thứ tự 4 5 hay 5 4
=>
Cách thứ 3: quick sort. Pick pivot, nếu pivot > k -> tìm trong khoảng từ pivot tới k. Nếu pivot = k -> kết quả. Nếu pivot < k -> tìm bên trái.
Cái thứ 2 hiểu là có thể improve nhưng mà từ đó suy ra cái 3 hơi ảo vì đó là 2 cách khác nhau hoàn toàn
).
Cái thứ 2 hiểu là có thể improve nhưng mà từ đó suy ra cái 3 hơi ảo vì đó là 2 cách khác nhau hoàn toàn
).
Mình nói hơi vắn tắt, pivot trong quicksort là vị trí chính xác của phần tử đấy trong sorted arrray.
Ví dụ 2 0 1 7 0 3, , sau khi gọi partition thì thành 2 0 1 0 3 7, trả về giá trị pivot = idx của 3 sau đó = 4
hoangreal
/*(C++) Chỉ dành cho bài tìm số lớn thứ 2 trong mảng chỉ dùng 1 vòng lặp. */
/* Ý tưởng:
- Cài sẵn 2 iterator chứa số lớn nhất và lớn nhì.
- Theo dõi iterator i để tìm ra số lớn nhất trong mảng và liên tục cập nhật số lớn nhì với nó (giá trị trong i).
- Với mỗi lần thực hiện bước 2, nếu số lớn thứ nhì > số lớn nhất, ta đổi vị trí hai iterators của hai số này.
*/
void swap(int& first, int& second){
int temp = first;
first = second;
second = temp;
}
int secondHighest_Num(int* array, int length){
int highest = 0;
int result = 1;
if(array[result] > array[highest]) swap(highest, result);
Code ngáo đá vãi,
đặt biến, swap loạn xạ. ko hiểu logic là gì. Test với case cơ bản {0,1,2} thì in ra 0. Chán
ý tưởng của tôi khá đơn giản tìm thằng lớn nhất, bằng cách swap 2 thằng liên tiếp để đồng thời dùng biến lưu lại thằng nhỏ hơn và so sánh để tìm ra thằng nhỏ thứ 2 thôi, tuy nhiên code chết ở chỗ, nếu chuỗi tăng dần thì nó không swap nên ko tìm đc
(trường hợp này thì thằng lớn nhất là thằng áp chót).
Code:
int secondHighest(int[] numbers) {
int sencondHighest = numbers[0];
int count = 0;
for (int i = 0; i < numbers.length - 1; i++) {
int a = numbers[i];
if (numbers[i] > numbers[i + 1]) {
if (count == 0) sencondHighest = numbers[i + 1];
if (sencondHighest < numbers[i + 1]) sencondHighest = numbers[i + 1];
numbers[i] = numbers[i + 1];
numbers[i + 1] = a;
count++;
} else if (count == 0) sencondHighest = numbers[numbers.length - 2];
}
return sencondHighest;
}
ý tưởng của tôi khá đơn giản tìm thằng lớn nhất, bằng cách swap 2 thằng liên tiếp để đồng thời dùng biến lưu lại thằng nhỏ hơn và so sánh để tìm ra thằng nhỏ thứ 2 thôi, tuy nhiên code chết ở chỗ, nếu chuỗi tăng dần thì nó không swap nên ko tìm đc
(trường hợp này thì thằng lớn nhất là thằng áp chót).
Code:
static int secondHighest(int[] numbers) {
int sencondHighest = numbers[0];
int count = 0;
for (int i = 0; i < numbers.length - 1; i++) {
int a = numbers[i];
if (numbers[i] > numbers[i + 1]) {
if (count == 0) sencondHighest = numbers[i + 1];
if (sencondHighest < numbers[i + 1]) sencondHighest = numbers[i + 1];
numbers[i] = numbers[i + 1];
numbers[i + 1] = a;
count++;
} else if (count == 0) sencondHighest = numbers[numbers.length - 2];
}
return sencondHighest;
}
Bạn khi post code lên đây thì ít nhất cũng nên nghĩ tới 2 cái:
- Logic mình đặt ra đúng chưa.
- Code chạy đúng một vài input chưa. (cũng là để verify logic)
Cứ post lên những đoạn code rất khó hiểu mà chạy sai thì để làm gì? Cái đó không giúp ích cho bạn cũng như mọi người, trong khi bài này là một bài rất đơn giản.
Hơn nữa những bài kiểu này thì lúc pv thật nên hỏi có được sửa input đầu vào không, nhưng trước tiên hãy nghĩ cách không sửa input đầu vào. Cách trên của bạn modify tùm lum cái mảng ban đầu luôn.
Edit: vừa thử với cái input 3 1 2 4 thấy sai lòi luôn.
ý tưởng của tôi khá đơn giản tìm thằng lớn nhất, bằng cách swap 2 thằng liên tiếp để đồng thời dùng biến lưu lại thằng nhỏ hơn và so sánh để tìm ra thằng nhỏ thứ 2 thôi, tuy nhiên code chết ở chỗ, nếu chuỗi tăng dần thì nó không swap nên ko tìm đc
(trường hợp này thì thằng lớn nhất là thằng áp chót).
Lời giải có cả đống ở những post trước rồi, éo biết code lại để thể hiện cái gì, mà code cũng éo xong
Loãng thớt vc
DreadLord
Bài đầu của chủ thớt là dạng Back Tracking mà...
Khó chỗ tính giá trị của biểu thức thôi. Có nhân và chia thì evaluate expression đéo phải đơn giản. Có * và / mà trong vòng 20' code xong một ctrình hoàn chỉnh nhận input, xuất output thì trừ khi IQ siêu cao xuất ý thành code hoặc là ng đã code quen mấy dạng tương tự, chứ ng thường làm thế nào đc...
Mình code cái hàm tính giá trị biểu thức sai phải debug mấy bận mới xong vkl
ý tưởng của tôi khá đơn giản tìm thằng lớn nhất, bằng cách swap 2 thằng liên tiếp để đồng thời dùng biến lưu lại thằng nhỏ hơn và so sánh để tìm ra thằng nhỏ thứ 2 thôi, tuy nhiên code chết ở chỗ, nếu chuỗi tăng dần thì nó không swap nên ko tìm đc
(trường hợp này thì thằng lớn nhất là thằng áp chót).
Bạn trc khi bắt đầu viết code phải nghĩ ra các step của thuật toán đã. Nếu bạn muốn manually maintain 2 số lớn nhất và secondlargest:
- chọn largest, secondlargest từ nums[0] và nums[1] ( lấy Math.min - Math.max cho đỡ if else)
- duyệt dãy từ phần tử thứ 2 trở đi đến hết, có mấy case:
+ nums(i)
> largest: update lại largest, 2ndlargest + 2ndlargest < nums(i): update 2ndlargest + do nothing với range còn lại. Cứ bắt đầu bằng suy nghĩ logic cơ bản như thế, rồi review lại xem edge cases thì có chết ko, có improve được code chỗ nào ko... Chứ nhìn code bạn nó không hợp lý tí gì, mà chạy thì sai toét
ZGhostRiderZ
Cho mình hỏi là phỏng vấn fresher front-end làm về website thì phỏng vấn có hỏi mấy câu thuật toán này không nhỉ ? Nhiều bài đọc không hiểu gì hết
Cho mình hỏi là phỏng vấn fresher front-end làm về website thì phỏng vấn có hỏi mấy câu thuật toán này không nhỉ ? Nhiều bài đọc không hiểu gì hết
Có chứ bạn. Front end là nền tảng của khoa học máy tính. Trong đó thuật toán là cốt lõi của Front end. Đọc thuật toán mà không hiểu thì không nên học Front end làm gì.
Bài đầu của chủ thớt là dạng Back Tracking mà...
Khó chỗ tính giá trị của biểu thức thôi. Có nhân và chia thì evaluate expression đéo phải đơn giản. Có * và / mà trong vòng 20' code xong một ctrình hoàn chỉnh nhận input, xuất output thì trừ khi IQ siêu cao xuất ý thành code hoặc là ng đã code quen mấy dạng tương tự, chứ ng thường làm thế nào đc...
Mình code cái hàm tính giá trị biểu thức sai phải debug mấy bận mới xong vkl
Nhân chia thì chắc dùng thêm một biến lưu lại phép tính cuối ngoài * / và giá trị cuối để có nhân hay chia thì áp vào số đó thôi.
Có chứ bạn. Front end là nền tảng của khoa học máy tính. Trong đó thuật toán là cốt lõi của Front end. Đọc thuật toán mà không hiểu thì không nên học Front end làm gì.
Really ???
Frontend fresher thì cũng sẽ có hỏi nhưng theo mình thấy thì hỏi ít và là mấy cái cơ bản như các loại sort, vv
À đây là nói trình độ fresher nhà, chưa dc lên level cao hơn nên cũng ko biết cao hơn thì sẽ hỏi gì
Really ???
Frontend fresher thì cũng sẽ có hỏi nhưng theo mình thấy thì hỏi ít và là mấy cái cơ bản như các loại sort, vv
À đây là nói trình độ fresher nhà, chưa dc lên level cao hơn nên cũng ko biết cao hơn thì sẽ hỏi gì
Nhầm lẫn rồi bạn ơi, cái thuật toán thì fresher hay không cũng vẫn hỏi như nhau thôi. Cái để hỏi và các level cao hơn là architectural design. Ở VN nhiều người title solution architect nhưng khi hỏi vòng này trả lời rất ú ớ, chỉ qua loa ở mức cơ bản (mình không nói tất cả nhưng mà gặp khá nhiều trường hợp như này rồi)
Nhầm lẫn rồi bạn ơi, cái thuật toán thì fresher hay không cũng vẫn hỏi như nhau thôi. Cái để hỏi và các level cao hơn là architectural design. Ở VN nhiều người title solution architect nhưng khi hỏi vòng này trả lời rất ú ớ, chỉ qua loa ở mức cơ bản (mình không nói tất cả nhưng mà gặp khá nhiều trường hợp như này rồi)
Tuỳ công ty nhưng xu hướng các công ty tech lớn hiện nay thì sẽ hỏi nhiều về kiến thức ở trường đặc biệt là cấu trúc dữ liệu và giải thuật.
Những ví dụ cơ bản như:
LinkedList vs ArrayList khác nhau ra sao, trường hợp nào nên lựa chọn cái nào.
Cách tổ chức cơ bản của HashMap/HashTable thế nào độ phức tạp khi truy xuất 1 phần tử, trường hợp xấu nhất ra sao
Nguyên lý của một số thuật toán sắp xếp nổi tiếng như Quick Sort, Merge Sort, Heap Sort. Với lại, khi giải quyết một vấn đề mà bạn cần dùng tới hàm sort được cung cấp sẵn thì bạn cũng cần biết độ phức tạp nó thế nào, và nắm được cách hoạt động của QuickSort cũng là điều cần thiết (không yêu cầu phải code lại trực tiếp)
Thích dùng leet code vì nó bắt buộc pass 100% test case, với lại nó cho kết quả so sánh tốc độ và memory so với các bài giải của bọn khác, và cảm giác nó gọn nhẹ.
Nên tập trung giải bài medium, được like nhiều ít dislike, cố gắng ít nhất tự giải được dù cùi bắp trước khi xem phần chia sẻ của bọn khác.
Cố gắng tổng 2 cái speed và memory trên 160 là ổn (nghĩa là mỗi cái nó cho biết đang tốt hơn bao nhiêu phần trăm ấy)
Mình nhớ mình phỏng vấn có câu thế này:
1: Check systax của các dấu []{} () có đúng hay không. Ví dụ "[[]()" là sai, "[[()]]" là đúng
2: Cho một chuỗi gồm , chữ ,số, số thập phân, hỗn sỗ(2/2/3). Trich hết tất cả số, số thập phân, phân số, hỗn số ra.
3: Xoay vòng mảng k lần ví dụ: [1,2,3], xoay 1 lần: (2,3,1), xoay 2 lân (3,1,2)
Tạm thời nhớ nhiêu đó.
1. Stack
2. Là sao nhỉ? tức cho 2/2/3 thì out là 2 , 2 và 3 ? thế thì 1 for lọc / ra là xong
3. Bài này thì quen quá rồi
Đây là bài toán của mình:
- input: "123456789", phép toán: cộng, trừ
- output: chèn phép toán cộng, trừ vào input string sao cho biểu thức có kết quả là 100.
Ví dụ: -1 + 2 - 3 + 4 + 5 + 6 + 78 + 9 (=100)
- Mở rộng thêm nếu có phép nhân và chia
Input là CỐ ĐỊNH hả bác?
Hay có thể thành "1222233333" hay có thể đổi range luôn, output có đổi không?
Dùng HashSet thì làm sao mà best performance được nhỉ? Hơn nữa lại chuyển qua array, rồi mới tạo string.
Mà cái hàm toArray của HashSet maintain được thứ tự insert vào set à? Hay nhỉ, mình không dùng C# nên không rành. Bên Java thì HashSet không đảm bảo được cái order này.
Array hay tạo string tất nhiên là best performance, vì về cơ bản nó chỉ thực hiện mỗi phép toán đổi pointer chứ có phải làm cái gì đâu.
Còn về HashSet tại sao bên Java lại không đảm bảo được cái order đấy? Bạn đã thử chưa? Tớ ko làm Java ko biết cách Java implement HashSet như thế nào chứ C# thì về cơ bản nó cũng chỉ là 1 vòng lặp từ đầu đến cuối, chưa có thì Add vào
foreach (T item in other) {
AddIfNotPresent(item);
}
Cty nào đấy bạn? Lần đầu tiên thấy có cty yêu cầu code 1 line cứ không phải min time/complexity
Chắc test độ thành thạo về ngôn ngữ, dùng hàm built in. Cho nên mới có thách thức 1 line. Chứ tự code thì chỉ 1 vòng for đơn giản là đã có giải thuật O(n) là đủ ngon rồi, mỗi tội ko phải 1 dòng thôi.
Array hay tạo string tất nhiên là best performance, vì về cơ bản nó chỉ thực hiện mỗi phép toán đổi pointer chứ có phải làm cái gì đâu.
Còn về HashSet tại sao bên Java lại không đảm bảo được cái order đấy? Bạn đã thử chưa? Tớ ko làm Java ko biết cách Java implement HashSet như thế nào chứ C# thì về cơ bản nó cũng chỉ là 1 vòng lặp từ đầu đến cuối, chưa có thì Add vào
foreach (T item in other) {
AddIfNotPresent(item);
}
Vấn đề là cùng O(N) nhưng cái constant nó là x3, x4 so với x1 thì vẫn là chậm hơn. Bạn tạo lòng vòng qua mấy cấu trúc dữ liệu liền. Mình không rõ cách tạo Array của String bên C# như nào, nhưng nếu là O(1) thì khá ảo.
HashSet bạn có hiểu cách thức hoạt động không? Lý do gì mà HashSet phải maintain cái insert order?
Đây là HashSet trong Java:
This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. This class permits the null element.
botmingoc
Set nó theo định nghĩa là ko maintain order của key. Để thêm các tính năng (maintain key order, sort key order) thì ngôn ngữ ví dụ như Java họ thêm LinkedHashSet hoặc TreeSet, làm thế nào để datastructure nó support được những tính năng đấy cũng khá thú vị, đi pv người ta cũng có thể hỏi.
Việc C# default hashset có thì chắc ngôn ngữ đấy họ implement hộ thôi, hay ko bằng hên
Vấn đề là cùng O(N) nhưng cái constant nó là x3, x4 so với x1 thì vẫn là chậm hơn. Bạn tạo lòng vòng qua mấy cấu trúc dữ liệu liền. Mình không rõ cách tạo Array của String bên C# như nào, nhưng nếu là O(1) thì khá ảo.
HashSet bạn có hiểu cách thức hoạt động không? Lý do gì mà HashSet phải maintain cái insert order?
Đây là HashSet trong Java:
Tại sao O(1) lại là ảo? Theo cá nhân mình đánh giá, có lẽ bạn chẳng hiểu gì về tầng dưới của ngôn ngữ bạn sử dụng. 1 Character Array đã nằm sẵn trong bộ nhớ, giờ cần biến nó thành String mà lại cho rằng cần nhiều hơn 1 phép toán thì đúng là đáng đi chết.
Tóm lại là bạn chưa hề thử, đúng không? HashSet ở C# cũng vậy, order ko được đảm bảo nếu theo lý thuyết. Tuy nhiên nếu bạn hỏi lý do gì để nó phải maintain thứ tự thì tớ nói cho bạn, đó là bởi cái cách người ta viết ra nó ở tầng dưới. Bạn đã bao giờ tự hỏi cách người ta xây dựng HashSet ở tầng dưới như thế nào chưa?
Hồi còn bé bố tớ có nói với tớ sự khác biệt giữa 1 người thợ điện và 1 kỹ sư điện khi đấu dây là ở chỗ thợ thì người ta được dạy đấu như thế nào chỉ biết đến đúng như thế, còn người kỹ sư thì kể cả không theo kiểu đấu đấy người ta cũng vẫn biết đấu như thế có hoạt động được hay không. Tớ chỉ nói thế còn bạn tự suy nghĩ nhé.
Tại sao O(1) lại là ảo? Theo cá nhân mình đánh giá, có lẽ bạn chẳng hiểu gì về tầng dưới của ngôn ngữ bạn sử dụng. 1 Character Array đã nằm sẵn trong bộ nhớ, giờ cần biến nó thành String mà lại cho rằng cần nhiều hơn 1 phép toán thì đúng là đáng đi chết.
Tóm lại là bạn chưa hề thử, đúng không? HashSet ở C# cũng vậy, order ko được đảm bảo nếu theo lý thuyết. Tuy nhiên nếu bạn hỏi lý do gì để nó phải maintain thứ tự thì tớ nói cho bạn, đó là bởi cái cách người ta viết ra nó ở tầng dưới. Bạn đã bao giờ tự hỏi cách người ta xây dựng HashSet ở tầng dưới như thế nào chưa?
Hồi còn bé bố tớ có nói với tớ sự khác biệt giữa 1 người thợ điện và 1 kỹ sư điện khi đấu dây là ở chỗ thợ thì người ta được dạy đấu như thế nào chỉ biết đến đúng như thế, còn người kỹ sư thì kể cả không theo kiểu đấu đấy người ta cũng vẫn biết đấu như thế có hoạt động được hay không. Tớ chỉ nói thế còn bạn tự suy nghĩ nhé.
Bạn tự tin convert từ Array sang String là dùng cùng memory với độ phức tạp o(1) ở tất cả các ngôn ngữ phổ biến?
Cái việc maintain thêm thứ tự làm tốn thêm memory. Bạn nghĩ rằng mặc định implement sẵn cái đó là hay? Tại sao Java phải có thêm LinkedHashSet bên cạnh HashSet?
Hơn nữa dùng Array check ký tự đã có chắc chắn nhanh hơn look up bằng HashSet.
Bạn tự tin cách của bạn là perfect thì bạn cứ nghĩ vậy đi
).
Tại sao O(1) lại là ảo? Theo cá nhân mình đánh giá, có lẽ bạn chẳng hiểu gì về tầng dưới của ngôn ngữ bạn sử dụng. 1 Character Array đã nằm sẵn trong bộ nhớ, giờ cần biến nó thành String mà lại cho rằng cần nhiều hơn 1 phép toán thì đúng là đáng đi chết.
Tóm lại là bạn chưa hề thử, đúng không? HashSet ở C# cũng vậy, order ko được đảm bảo nếu theo lý thuyết. Tuy nhiên nếu bạn hỏi lý do gì để nó phải maintain thứ tự thì tớ nói cho bạn, đó là bởi cái cách người ta viết ra nó ở tầng dưới. Bạn đã bao giờ tự hỏi cách người ta xây dựng HashSet ở tầng dưới như thế nào chưa?
Hồi còn bé bố tớ có nói với tớ sự khác biệt giữa 1 người thợ điện và 1 kỹ sư điện khi đấu dây là ở chỗ thợ thì người ta được dạy đấu như thế nào chỉ biết đến đúng như thế, còn người kỹ sư thì kể cả không theo kiểu đấu đấy người ta cũng vẫn biết đấu như thế có hoạt động được hay không. Tớ chỉ nói thế còn bạn tự suy nghĩ nhé.
Thôi bớt xl lại, sai thì nhận mẹ đi.
hashset nó ko đảm bảo thứ tự, cậu làm đc thấy nó chạy đúng lần này ko có nghĩa nó đúng hết. Official document đã nói muốn đảm bảo thì phải dùng linked hash set, cậu giỏi hơn bọn implement và viết document?
còn performance thì nói thẳng ra dùng set hay map cửa gì so với array, char to byte rồi nhét vào array thì chả nhanh nhanh hơn tỉ lần cái bọn set với map. Bài này cty tôi pv mà làm hashmap hashset thì chỉ đc điểm trung bình chứ ngồi đó mà best.
hashset nó ko đảm bảo thứ tự, cậu làm đc thấy nó chạy đúng lần này ko có nghĩa nó đúng hết. Official document đã nói muốn đảm bảo thì phải dùng linked hash set, cậu giỏi hơn bọn implement và viết document?
còn performance thì nói thẳng ra dùng set hay map cửa gì so với array, char to byte rồi nhét vào array thì chả nhanh nhanh hơn tỉ lần cái bọn set với map. Bài này cty tôi pv mà làm hashmap hashset thì chỉ đc điểm trung bình chứ ngồi đó mà best.
Bác ơi mình vừa đọc thì hình như bên C# implement HashSet giống LinkedHashSet bên Java thật. Nhưng mấy cái còn lại như đoạn convert giữa String, Array mình nghĩ phải allocate vùng nhớ mới. Dùng chung thì rất nguy hiểm vì nếu modify memory thì ảnh hưởng cả 2 cái. Hơn nữa 2 ctdl này chưa chắc đã dùng chung cách lưu trữ mà point chung một vùng memory được.
Bác ơi mình vừa đọc thì hình như bên C# implement HashSet giống LinkedHashSet bên Java thật. Nhưng mấy cái còn lại như đoạn convert giữa String, Array mình nghĩ phải allocate vùng nhớ mới. Dùng chung thì rất nguy hiểm vì nếu modify memory thì ảnh hưởng cả 2 cái. Hơn nữa 2 ctdl này chưa chắc đã dùng chung cách lưu trữ mà point chung một vùng memory được.
tôi cũng ko rành C#, cũng chả quan tâm, chỉ ghét cách nói chuyện thợ với kĩ sư đồ, cách giải best đồ nghe khó chịu. Kể cả hashset c# nó maintain order cho mình thì cách đó cũng đéo phải best, thích thì ra đây tay đôi benchmark.
tôi cũng ko rành C#, cũng chả quan tâm, chỉ ghét cách nói chuyện thợ với kĩ sư đồ, cách giải best đồ nghe khó chịu. Kể cả hashset c# nó maintain order cho mình thì cách đó cũng đéo phải best, thích thì ra đây tay đôi benchmark.
Uhm mình công nhận. Theo mình quan trọng nhất để giỏi là tình thần tiếp thu cầu thị. Kiểu nói chuyện bề trên đó thì không bảo giờ xuất sắc được : )).
hashset nó ko đảm bảo thứ tự, cậu làm đc thấy nó chạy đúng lần này ko có nghĩa nó đúng hết. Official document đã nói muốn đảm bảo thì phải dùng linked hash set, cậu giỏi hơn bọn implement và viết document?
còn performance thì nói thẳng ra dùng set hay map cửa gì so với array, char to byte rồi nhét vào array thì chả nhanh nhanh hơn tỉ lần cái bọn set với map. Bài này cty tôi pv mà làm hashmap hashset thì chỉ đc điểm trung bình chứ ngồi đó mà best.
Góc nhìn mỗi người mỗi khác, tôi ko ý kiến. Tôi thuộc mẫu người ko dễ dàng thỏa mãn với câu trả lời được cung cấp sẵn mà luôn muốn biết nó đúng thì là tại sao, sai thì cũng phải biết sai ở chỗ nào, chỉ ra ví dụ nào nó sai thay vì phán đúng sai chỉ vì người ta bảo tôi như thế.
Mục tiêu tôi hướng đến là phải như cái ông bác sỹ dùng bia để giải độc cho bệnh nhân ấy. Trong mắt tôi đó mới là bác sỹ, kỹ sư chân chính. Còn góc nhìn cậu khác, tùy cậu, có lẽ chúng ta sẽ không bao giờ có thể hiểu được nhau nên tốt nhất dừng ở đây. Sai? Tôi vẫn cứ tiếp tục làm thế đấy. Nếu cậu thích tôi sẵn sàng làm cái độ nếu cậu chỉ ra được cái input nào nó chạy sai, chỉ sợ cậu đếch dám chơi mà thôi.
onib18
Đứng góc độ của mình, việc đưa đề yêu cầu chỉ code một dòng phần nào đó hơi đánh đố kiểu như có thể có một cách đặc thù nào đó để giải bài này nhưng chưa hẳn là cách hiệu quả nhất, chỉ là code gọn và hơi độc, lạ. Việc dùng yêu cầu này để đánh giá ứng viên có phần chưa được khách quan cho lắm. Nhưng chuyện đó tuỳ quan điểm của người phỏng vấn.
Ở cách giải này:
C#:
public string GetUniqueString(string s)
{
return new string((new HashSet<char>(s.ToCharArray())).ToArray());
}
Tuy nhìn nó là 1 dòng code nhưng thực ra nó là ghép của nhiều dòng code lại, dạng thế này:
Java:
public String getUniqueString(String s) {
char[] chars = s.toCharArray();
HashSet<char> charSet = new HashSet<char>(chars);
char[] resultArr = charSet.toArray();
return new String(resultArr);
}
Phân tích ra thử nhé:
s.toCharArray() --> cái này sẽ copy char array bên trong String sang một char array mới
new HashSet<char>(chars) --> cái này sẽ chạy tuần tự từng phần tử bên trong char array và thực hiện việc add vào HashSet
charSet.toArray() --> bản thân bên trong HashSet có 1 array và tuỳ cách implement khác nhau mà mỗi phần tử của array có thể là 1 Tree hoặc LinkedList và tuỳ cách xử lý khác nhau khi resize, khi xảy ra collision... mà thứ tự khi lấy ra sẽ khác nhau, đó là lý do trong document họ luôn ghi là không đảm bảo thứ tự lấy ra sẽ y hệt thứ tự thêm vào. Nên việc thấy hiện tại nó đúng thứ tự thêm vào và sử dụng nó vì bạn hiểu thì có 1 kẽ hở là code logic của bạn mỗi lần đổi phiên bản SDK không đảm bảo sẽ còn chạy đúng, điều này cực kỳ nguy hiểm.
new String(resultArr) --> copy char array 1 lần nữa
Như vậy, tính ra độ hiệu quả thực sự không cao vì dùng bộ nhớ tạm nhiều quá, độ phức tạp thì vẫn O(N)
Tiếp theo là cái độ phức tạp của dòng 1 và dòng 4. Việc từ String ra charArray hoặc từ charArray tạo String
Tại sao O(1) lại là ảo? Theo cá nhân mình đánh giá, có lẽ bạn chẳng hiểu gì về tầng dưới của ngôn ngữ bạn sử dụng. 1 Character Array đã nằm sẵn trong bộ nhớ, giờ cần biến nó thành String mà lại cho rằng cần nhiều hơn 1 phép toán thì đúng là đáng đi chết.
Cái này mình nghĩ bạn nhầm lẫn chút rồi, chuyển từ array qua String hay từ String qua array tuy có sẵn array đó nhưng đều copy hết chứ không có dùng trực tiếp cái array đó đâu, về độ phức tạp, nó không phải O(1), cũng không hẳn O(N), vì nó chỉ là O(N) nếu dùng vòng lặp để copy từng phần tử, cách này chậm nên thường sẽ dùng Array Copy, cách này sẽ copy nguyên block vùng nhớ luôn, sẽ nhanh hơn cách lặp từng phần tử, nhưng tốc độ cũng sẽ tăng theo kích thước mảng, nên không thể nói nó O(1) được.
Quay lại bài toán ban đầu, mình nghĩ đề ra có 1 điểm cần làm rõ:
Input Coooovvvidd 19 --> Covid 19 nhưng đây chỉ là một input mẫu, nếu yêu cầu là loại bỏ các ký tự lặp đứng liền nhau (mình nghĩ khả năng cao là yêu cầu này) thì cách dùng HashSet của bạn sẽ chết với test case này:
Cooooooorrrronnnnnnaaaa vì đúng ra phải xuất ra Corona thì sẽ xuất ra Corna hoặc Crona
Bài này chỉ cần dùng for chạy và xem nếu ký tự hiện tại có ký tự đứng trước giống nó thì không thêm vào array mới, ngược lại thì thêm vào. Sau đó chuyển array đó thành String kết quả.
Về chi tiết thì mình nghĩ có 2 lựa chọn:
Dùng StringBuilder để đưa ký tự vào rồi chuyển sang String --> cách này trực quan, tuy nhiên có chi phí ẩn là mỗi lần resize phải cấp phát lại vùng nhớ
Chạy 1 lần đầu đếm xem bao nhiêu lần xảy ra lặp --> tính được kích thước array kết quả --> khởi tạo với đúng kích thước đó và chạy lặp để điền ký tự vào --> cách này tuy lặp 2 lần nhưng tư tưởng là hạn chế tối đa việc sử dụng bộ nhớ, tránh việc allocate thừa hoặc allocate nhiều lần khi resize
Việc chọn cách 1 hay 2 ở mức độ làm bài test không có nhiều khác biệt, nhưng khi lên các bài toán thực tế, việc cân bằng giữa sử dụng memory và CPU cũng tác động tới performance khá nhiều.
mistake37
Bài Coooooviddd 19 ra Covid 19 chỉ đúng với input đấy thôi, input khác ko chơi đc. Ví dụ: Carrrrrtooooon -> Cartoon là ăn hành. Cho nên print("Covid 19") là chuẩn nhất r. Mình code tùm lum thứ mà nói thật bảo giải mấy cái này chịu luôn
Đứng góc độ của mình, việc đưa đề yêu cầu chỉ code một dòng phần nào đó hơi đánh đố kiểu như có thể có một cách đặc thù nào đó để giải bài này nhưng chưa hẳn là cách hiệu quả nhất, chỉ là code gọn và hơi độc, lạ. Việc dùng yêu cầu này để đánh giá ứng viên có phần chưa được khách quan cho lắm. Nhưng chuyện đó tuỳ quan điểm của người phỏng vấn.
Ở cách giải này:
C#:
public string GetUniqueString(string s)
{
return new string((new HashSet<char>(s.ToCharArray())).ToArray());
}
Tuy nhìn nó là 1 dòng code nhưng thực ra nó là ghép của nhiều dòng code lại, dạng thế này:
Java:
public String getUniqueString(String s) {
char[] chars = s.toCharArray();
HashSet<char> charSet = new HashSet<char>(chars);
char[] resultArr = charSet.toArray();
return new String(resultArr);
}
Phân tích ra thử nhé:
s.toCharArray() --> cái này sẽ copy char array bên trong String sang một char array mới
new HashSet<char>(chars) --> cái này sẽ chạy tuần tự từng phần tử bên trong char array và thực hiện việc add vào HashSet
charSet.toArray() --> bản thân bên trong HashSet có 1 array và tuỳ cách implement khác nhau mà mỗi phần tử của array có thể là 1 Tree hoặc LinkedList và tuỳ cách xử lý khác nhau khi resize, khi xảy ra collision... mà thứ tự khi lấy ra sẽ khác nhau, đó là lý do trong document họ luôn ghi là không đảm bảo thứ tự lấy ra sẽ y hệt thứ tự thêm vào. Nên việc thấy hiện tại nó đúng thứ tự thêm vào và sử dụng nó vì bạn hiểu thì có 1 kẽ hở là code logic của bạn mỗi lần đổi phiên bản SDK không đảm bảo sẽ còn chạy đúng, điều này cực kỳ nguy hiểm.
new String(resultArr) --> copy char array 1 lần nữa
Như vậy, tính ra độ hiệu quả thực sự không cao vì dùng bộ nhớ tạm nhiều quá, độ phức tạp thì vẫn O(N)
Tiếp theo là cái độ phức tạp của dòng 1 và dòng 4. Việc từ String ra charArray hoặc từ charArray tạo String
Cái này mình nghĩ bạn nhầm lẫn chút rồi, chuyển từ array qua String hay từ String qua array tuy có sẵn array đó nhưng đều copy hết chứ không có dùng trực tiếp cái array đó đâu, về độ phức tạp, nó không phải O(1), cũng không hẳn O(N), vì nó chỉ là O(N) nếu dùng vòng lặp để copy từng phần tử, cách này chậm nên thường sẽ dùng Array Copy, cách này sẽ copy nguyên block vùng nhớ luôn, sẽ nhanh hơn cách lặp từng phần tử, nhưng tốc độ cũng sẽ tăng theo kích thước mảng, nên không thể nói nó O(1) được.
Quay lại bài toán ban đầu, mình nghĩ đề ra có 1 điểm cần làm rõ:
Input Coooovvvidd 19 --> Covid 19 nhưng đây chỉ là một input mẫu, nếu yêu cầu là loại bỏ các ký tự lặp đứng liền nhau (mình nghĩ khả năng cao là yêu cầu này) thì cách dùng HashSet của bạn sẽ chết với test case này:
Cooooooorrrronnnnnnaaaa vì đúng ra phải xuất ra Corona thì sẽ xuất ra Corna hoặc Crona
Bài này chỉ cần dùng for chạy và xem nếu ký tự hiện tại có ký tự đứng trước giống nó thì không thêm vào array mới, ngược lại thì thêm vào. Sau đó chuyển array đó thành String kết quả.
Về chi tiết thì mình nghĩ có 2 lựa chọn:
Dùng StringBuilder để đưa ký tự vào rồi chuyển sang String --> cách này trực quan, tuy nhiên có chi phí ẩn là mỗi lần resize phải cấp phát lại vùng nhớ
Chạy 1 lần đầu đếm xem bao nhiêu lần xảy ra lặp --> tính được kích thước array kết quả --> khởi tạo với đúng kích thước đó và chạy lặp để điền ký tự vào --> cách này tuy lặp 2 lần nhưng tư tưởng là hạn chế tối đa việc sử dụng bộ nhớ, tránh việc allocate thừa hoặc allocate nhiều lần khi resize
Việc chọn cách 1 hay 2 ở mức độ làm bài test không có nhiều khác biệt, nhưng khi lên các bài toán thực tế, việc cân bằng giữa sử dụng memory và CPU cũng tác động tới performance khá nhiều.
Tự nhiên đọc lại đoạn kia bảo mình đáng đi chết, cũng thấy buồn cười : )).
Cái vụ O(N) này mình có giải thích đó bạn, thường sẽ chuyển xuống native gọi hàm arrayCopy, hàm này nó copy nguyên block vùng nhớ luôn, nên cũng khó nói. Mà có thể do mình tham khảo bên code Java (mình không chuyên bên C#)
Có topic này liên quan khá hay
https://stackoverflow.com/questions...-arraycopy-than-a-for-loop-for-copying-arrays
rosario_1
Đọc bài của mấy bạn tớ cứ cười mãi, vì cá nhân tớ tự nhìn bản thân thì thấy mình cái gì cũng kém cỏi, nhưng lại ko đến nỗi nào chỉ nhờ vào biết cầu thị.
Thứ nhất, nói về HashSet trong .Net. Có bạn bảo nó implement giống LinkedHashSet Java, tớ khẳng định không phải. Tớ ko nhớ Java lắm, nhưng nhìn chữ "Linked" là đủ tự tin để nói vậy vì trên thực tế HashSet của .Net là unlink. Nó giữ được order là bởi cái cách người ta code ở tầng dưới và thực tế điều này sẽ ko còn đúng nữa 1 khi bạn gọi remove().
Cho nên bạn Onib18 bảo đây là nguy hiểm, hoàn toàn có thể ko còn chạy đúng nữa khi người ta thay đổi cách implement HashSet ở tầng dưới là chính xác. Tuy nhiên đây ko phải là làm thật, mà chỉ đơn giản là trạng thái "đang học" thôi. Đã là học, thì
nên trả lời được câu hỏi
"làm không đúng chuẩn thì có chạy được không?" . Vì những kỹ sư, chuyên gia giỏi nhất tớ biết lối tư duy của họ đều như vậy, tớ chỉ là đơn giản muốn học họ. Muốn học thì phải đòi hỏi bản thân cao hơn, cho nên sinh ra quan điểm nếu không trả lời được cái câu hỏi trên thì chỉ dừng ở mức thợ, hay cùng lắm là "dối sư" mà thôi chứ ko thể coi là "kỹ sư" thực thụ. Đã "kỹ sư" là phải "kỹ", mà đã "kỹ" thì ko chấp nhận lý do "vì người này bảo thế này, document kia bảo thế nọ" mà phải có lý do tại sao dựa trên nguyên lý, và tốt hơn là code ví dụ. Nhấn mạnh, đây chỉ là
quan điểm cá nhân ko ảnh hưởng tới ai và cũng ko có ý định chỉ trích giễu cợt ai. Có những lúc tớ vẫn tự giễu cợt chính bản thân mình vừa là "dối sư" như thế đấy.
Cuối cùng bàn về Array Copy trong .Net. Các bạn nên biết việc ra quyết định Deep Copy (copy giá trị) hay Shallow Copy (copy reference) là tùy compiler, thường thì primitive type nó sẽ Deep Copy còn reference là Shallow. Tuy nhiên bàn về bản chất thì trong .Net string chính là character array. Bạn nào bảo O(1) không được tớ tự Code 1 cái O(1), việc tớ làm chỉ đơn giản lấy ra pointer của string đổi type thành character array là xong ngay.
C#:
static void Main(string[] args)
{
string s = "abc";
GCHandle objHandle = GCHandle.Alloc(s, GCHandleType.WeakTrackResurrection);
var address = GCHandle.ToIntPtr(objHandle);
var b = GetInstance<char[]>(address);
Console.WriteLine(b[0]);
Console.ReadLine();
}
public static unsafe T GetInstance<T>(IntPtr pointer)
{
try
{
var fakeInstance = default(T);
TypedReference typedReference = __makeref(fakeInstance);
*(IntPtr*)(&typedReference) = pointer;
T instance = (T)__refvalue(typedReference, T);
return instance;
}
catch
{
return default(T);
}
}
Lưu ý là để default setting của C# đoạn code trên ko compile được, muốn compile thì phải chuyển build setting của project sang "allow unsafe code". Kết quả ra "a" đúng như mong muốn.
Nhầm lẫn rồi bạn ơi, cái thuật toán thì fresher hay không cũng vẫn hỏi như nhau thôi. Cái để hỏi và các level cao hơn là architectural design. Ở VN nhiều người title solution architect nhưng khi hỏi vòng này trả lời rất ú ớ, chỉ qua loa ở mức cơ bản (mình không nói tất cả nhưng mà gặp khá nhiều trường hợp như này rồi)
Cũng không phải là câu hỏi cho SA, nhiều công ty không có vị trí này, nhưng mà để đánh gia level của ứng viên thì sẽ đưa một câu hỏi architectural design/system design tuỳ vào làm việc bên platform nào mà câu hỏi sẽ thiên về platform đó (nhưng không gói gọn riêng plarform đó nhé)
Bạn có thể tham khảo thử ở đây
https://qr.ae/pNr0SM Đối với nhiều công ty, việc tự design được kiến trúc + giải pháp cho một vấn đề là bắt buộc đối với senior, không như các công ty outsource phân chia ra nhiều chức danh để còn liên quan tới việc tính tiền khách hàng.
Giả sử bạn làm bên web/mobile và phỏng vấn hỏi bạn design một tính năng đồng bộ file giữa 2 thiết bị (kiểu như Google Drive chẳng hạn), bạn cần phải nêu được của bên backend API cần API nào, contract ra sao, data format thế nào, rồi client sẽ hoạt động ra sao... có bạn SA nhưng chỉ nói là back end thì cần một con server resources và một service cung cấp API để client gọi, ngoài ra không nêu được thêm chi tiết nào như vậy nhiều công ty sẽ không offer mức senior.
Hoặc có bạn từng có kinh nghiệm làm streaming trả lời là làm tính năng video streaming dùng thư viện rất hiệu quả và bandwidth sử dụng chỉ có
~625 Bps thì rất khó để có thể coi là senior được, chỉ có thể nói là dùng thư viện quen tay thôi.
botmingoc
System design là open-ended question, ko có đáp án chung. Bạn phải là người lead cuộc trao đổi với interviewer để design được hệ thống tốt nhất theo requirement (interviewer sẽ là người cung cấp các requirements). Câu hỏi đa dạng, mình đi pv đã gặp các câu: design booking hotel, chat app, event reminder app, throttling counter...
Nếu bạn là senior (ae dev ở VN cứ hay kêu pv thuật toán làm gì, rồi tự phong senior SA các kiểu thì đây là vòng để vùng vẫy thể hiện), phải làm bật được ở cái design của bạn:
- Requirements gathering: cứ cắm đầu vào design mà ko xác định rõ ai là người dùng, muốn có tính năng gì, bao nhiêu user, throughput data estimate bao nhiêu... là chết.
- Tính hữu dụng: người dùng xác định là ai, funtional/ non-functional features (CAP theorum). Use cases. Throughput của system.
- Kiến thức cơ bản vững: từ use case design được API, sau đó design đc db, entity, table relationships... Nói về lựa chọn db. Vẽ high level design. Thuật toán nếu có thì code/ trình bày nhanh. Nên design cơ bản dễ hiểu đã, đừng tham add thêm nhiều cái fancy vào, dive deep là để bước tiếp theo. Cứ theo nguyên lý seperate of concern, single source of truth,... cho dễ design. input/ output của mỗi component của diagram của mình là cái gì, data lưu cái gì, lưu chỗ nào...
- Scale up: có thể interviewer xoáy vào bất kỳ chỗ nào, khả năng cao là bạn chưa biết về cái đấy, cần bình tĩnh nhìn lại tình hình, điểm nào có thể scale up, dựa vào technique ntn. Có thể yêu cầu bạn scale up thuật toán/ db/ hot nodes....
- Các models có thể improve cho system: cache (cache cái gì, cache chỗ nào, eviction strategy...), message queue design, CDN, API Gateway,... Nếu lưu dữ liệu vào db hay đâu đó, cố gắng design 1 cái caching layer trước đó, sẽ rất hợp lý. Nếu chuyển server A nhận và xử lý data, sau đó gửi sang B cho bước tiếp theo, data nhiều và lớn thường sẽ ko gửi trực tiếp mà có cái message queue ở giữa để dễ scale up...
System design là 1 cái vòng kiến thức rất sâu, bạn càng senior và càng hiểu biết thì design của bạn càng tốt. Câu hỏi trông thì rất dễ trùng (chatapp, uber backend, design instagram...) nhưng thật ra không trùng tí nào, mỗi người phỏng vấn sẽ add những constrants khác nhau và bạn phải có nhiệm vụ đưa ra solution giải quyết cái đấy. Trả lời sâu, đưa ra multiple options, hiểu rõ tradeoff của từng options... thì bạn sẽ có good offer
C# thì về cơ bản nó cũng chỉ là 1 vòng lặp từ đầu đến cuối, chưa có thì Add vào
foreach (T item in other) {
AddIfNotPresent(item);
}
Ơ, đọc tới đây thì thật mình nản v~ cả nồi
Nhìn vafoo code này thanh niên phán HashSet trong C# đảm bảo thứ tự add vào?
Đến quỳ, nản vs trình độ IT nước nhà
Hover
Mấy page rồi toàn tranh luận mấy cái đâu đâu, post một bài đơn giản để mấy bác thảo luận nè
Let's define a "sevenish" number to be one which is either a power of 7, or the sum of unique powers of 7. The first few sevenish numbers are 1, 7, 8, 49, and so on. Create an algorithm to find the nth sevenish number.
zulu
ok thà như ông nối cái này từ ban đầu đi là tôi ko ý kiến r . Chứ đọc bài đâu tiên ông phán đảm bảo order thì ngán thật
vì trên thực tế HashSet của .Net là unlink. Nó giữ được order là bởi cái cách người ta code ở tầng dưới và thực tế điều này sẽ ko còn đúng nữa 1 khi bạn gọi remove().
Mấy page rồi toàn tranh luận mấy cái đâu đâu, post một bài đơn giản để mấy bác thảo luận nè
Let's define a "sevenish" number to be one which is either a power of 7, or the sum of unique powers of 7. The first few sevenish numbers are 1, 7, 8, 49, and so on. Create an algorithm to find the nth sevenish number.
Số sevenish là số hoặc là 7^x; hoặc là tổng của các số 7^x trong đó mỗi x là duy nhất. Tìm thuật toán tìm số sevenish thứ nth. kiểu như svenish với n=1=> 7^0, n=2 => 7^1, n=3 => 7^0+7^1.
Mấy page rồi toàn tranh luận mấy cái đâu đâu, post một bài đơn giản để mấy bác thảo luận nè
Let's define a "sevenish" number to be one which is either a power of 7, or the sum of unique powers of 7. The first few sevenish numbers are 1, 7, 8, 49, and so on. Create an algorithm to find the nth sevenish number.
dự là như này : phân tích ra n hệ nhị phân, n = 2^k * b1 + 2^(k-1) * b2 + .. 2^0* bk với các số b là 0 hoặc 1.
đáp án là 7^k * b1 + 7^(k-1)*b2 + ... + 7^0*bk
C++:
#include <bits/stdc++.h>
using namespace std;
int main() {
long long n;
cin >> n;
long long ans = 0, tmp = 1;
while (n) {
ans += tmp * (n & 1);
n >>= 1;
tmp *= 7;
}
cout << ans;
}
dự là như này : phân tích ra n hệ nhị phân, n = 2^k * b1 + 2^(k-1) * b2 + .. 2^0* bk với các số b là 0 hoặc 1.
đáp án là 7^k * b1 + 7^(k-1)*b2 + ... + 7^0*bk
C++:
#include <bits/stdc++.h>
using namespace std;
int main() {
long long n;
cin >> n;
long long ans = 0, tmp = 1;
while (n) {
ans += tmp * (n & 1);
n >>= 1;
tmp *= 7;
}
cout << ans;
}
Đúng rồi nha, như chuyển n sang số nhị phân rồi tính giá trị số nhị phân đó trong hệ 7.
Ngoài ra, cái đề bài covid 19 kia, thực sự là đề ko có dc rõ ràng. Mà đề ko rõ ràng thì rất khó nói đúng sai, tùy trường hợp thôi.
Bạn đừng lấy document ra trích dẫn để giải thích, cái đó như tớ đã nói ở trên tớ quan niệm kiểu giải thích như vậy chỉ dành cho thợ hay cùng lắm là "dối sư" mà thôi. Với tư duy của "kỹ sư" thì chừng đó là chưa đủ. Nguyên nhân là bởi có rất nhiều thứ để đảm bảo an toàn người ta cứ nói tuyệt đối vậy, chứ thực ra có rất nhiều thứ vẫn được nếu như bạn "khúc chiết" 1 tẹo.
Ngay như ví dụ code tớ đưa ở trên là đã gặp ngay ví dụ rồi. Document thì bảo C# string là "immutable", tuy nhiên nếu bạn chạy code của tớ chỗ, gán b[0] = 'd' chẳng hạn, rồi print s ra thấy kết quả là "dbc" ngay, nào phải "immutable" đâu.
string s = "abc";
GCHandle objHandle = GCHandle.Alloc(s, GCHandleType.WeakTrackResurrection);
var address = GCHandle.ToIntPtr(objHandle);
var b = GetInstance<char[]>(address);
b[0]='d';
Console.WriteLine(s);
Nói thế chẳng nhẽ Microsoft nó document không chính xác. Cũng chưa hẳn vậy, mà là phải hiểu string chỉ "immutable" với "managed code" thôi chứ nếu "unsafe code" thì không đúng.
Bạn đừng lấy document ra trích dẫn để giải thích, cái đó như tớ đã nói ở trên tớ quan niệm kiểu giải thích như vậy chỉ dành cho thợ hay cùng lắm là "dối sư" mà thôi. Với tư duy của "kỹ sư" thì chừng đó là chưa đủ. Nguyên nhân là bởi có rất nhiều thứ để đảm bảo an toàn người ta cứ nói tuyệt đối vậy, chứ thực ra có rất nhiều thứ vẫn được nếu như bạn "khúc chiết" 1 tẹo.
Ngay như ví dụ code tớ đưa ở trên là đã gặp ngay ví dụ rồi. Document thì bảo C# string là "immutable", tuy nhiên nếu bạn chạy code của tớ chỗ, gán b[0] = 'd' chẳng hạn, rồi print s ra thấy kết quả là "dbc" ngay, nào phải "immutable" đâu.
string s = "abc";
GCHandle objHandle = GCHandle.Alloc(s, GCHandleType.WeakTrackResurrection);
var address = GCHandle.ToIntPtr(objHandle);
var b = GetInstance<char[]>(address);
b[0]='d';
Console.WriteLine(s);
Nói thế chẳng nhẽ Microsoft nó document không chính xác. Cũng chưa hẳn vậy, mà là phải hiểu string chỉ "immutable" với "managed code" thôi chứ nếu "unsafe code" thì không đúng.
Ông nói chuyện buồn cười.
Ông nói thế thì cũng phải coi cái ngữ cảnh ở đây là gì. Code của ông đang xài Hashset.
Ông dùng cái HashSet dc "implemented" by M$, thì ko đọc tài liệu của nó thì đọc tài liệu của ông à?
Ngữ cảnh ở đây là cái code java giải bài của ông nhé, đừng lươn lẹo ở đây.
Cái đoạn String ông giải thích rồi code ví dụ các kiểu, rồi sao, liên quan gì tới cái bài mà ông dùng HashSet để giải?
Ông comment như thế này:
Thứ nhất, nói về HashSet trong .Net. Có bạn bảo nó implement giống LinkedHashSet Java, tớ khẳng định không phải. Tớ ko nhớ Java lắm, nhưng nhìn chữ "Linked" là đủ tự tin để nói vậy vì trên thực tế HashSet của .Net là unlink. Nó giữ được order là bởi cái cách người ta code ở tầng dưới và thực tế điều này sẽ ko còn đúng nữa 1 khi bạn gọi remove()
Tôi ko chơi C#, giờ phải chọn giữa document của M$ và ông thì tất nhiên là tôi chọn document chuẩn của M$ rồi bạn ạ.
Và nó nói thế này nè:
"The
HashSet<T> class provides high-performance set operations. A set is a collection that contains no duplicate elements, and whose elements are in no particular order."
Tôi dịch tiếng Việt luôn nhé: HashSet<T> cung cấp các thao tác trên "set" với "high performance". Một "set" là một tập hợp ko chứa các phần tử trùng (duplicate) và các phần tử này ko theo một thứ tự cụ thể!.
Vậy ông kêu order ở đây là order gì thế? Mời ông giải thích hộ. Order này là order theo input hay là order theo sorted?
Còn ông thích đào sâu đúng ko? Vậy ông biết cấu trúc dữ liệu của HashSet là gì mà nó "high performance", "ko có dupliate", nhưng lại "no particular order" ko? Đấy tìm hiểu cái đó thì mới gọi là đào sâu.
Còn nếu ông vẫn giữ ý kiến là ". Nó giữ được order là bởi cái cách người ta code ở tầng dưới và thực tế điều này sẽ ko còn đúng nữa 1 khi bạn gọi remove()" thì mời ông phân tích 1 bài về cấu trúc dữ liệu của HashSet để nó làm được điều đó.
Cái đó nó mới gọi là đào sâu bạn ạ.
Fire Of Heart
Còn bản thân cái bài giải của ông thì tôi đã nói ở trên, cái đề ko rõ ràng, nên ko chốt là ông giải đúng hay sai.
Nhưng như mấy ông khác có phân tích, bài này mà input "Coroonanaroooo" là ông sai ngay.
Bạn đừng lấy document ra trích dẫn để giải thích, cái đó như tớ đã nói ở trên tớ quan niệm kiểu giải thích như vậy chỉ dành cho thợ hay cùng lắm là "dối sư" mà thôi. Với tư duy của "kỹ sư" thì chừng đó là chưa đủ. Nguyên nhân là bởi có rất nhiều thứ để đảm bảo an toàn người ta cứ nói tuyệt đối vậy, chứ thực ra có rất nhiều thứ vẫn được nếu như bạn "khúc chiết" 1 tẹo.
Ngay như ví dụ code tớ đưa ở trên là đã gặp ngay ví dụ rồi. Document thì bảo C# string là "immutable", tuy nhiên nếu bạn chạy code của tớ chỗ, gán b[0] = 'd' chẳng hạn, rồi print s ra thấy kết quả là "dbc" ngay, nào phải "immutable" đâu.
string s = "abc";
GCHandle objHandle = GCHandle.Alloc(s, GCHandleType.WeakTrackResurrection);
var address = GCHandle.ToIntPtr(objHandle);
var b = GetInstance<char[]>(address);
b[0]='d';
Console.WriteLine(s);
Nói thế chẳng nhẽ Microsoft nó document không chính xác. Cũng chưa hẳn vậy, mà là phải hiểu string chỉ "immutable" với "managed code" thôi chứ nếu "unsafe code" thì không đúng.
Unsafe code làm gì có ai sử dụng nhiều trong production? Hơn nữa như cái HashMap, cái đó không được guarantee phía dưới, nếu nâng version bạn lại đi ngồi đọc lại xem người ta implement cái gì ở dưới à?
Bạn lúc đầu nói mình không ra gì (đi chết đi, thợ học việc), mình đã thấy buồn cười rồi. Sau bạn lại nói là bạn có tinh thần cầu thị cao, rồi những đoạn bạn nói đằng sau chả liên quan gì tới cái đoạn bạn code lúc đầu về cái đoạn convert từ array qua string mà bạn tự cho là "tối ưu nhất", mình thấy những lời bạn nói hoàn toàn mâu thuẫn nhau và chả có giá trị gì cả.
Bạn đừng lấy document ra trích dẫn để giải thích, cái đó như tớ đã nói ở trên tớ quan niệm kiểu giải thích như vậy chỉ dành cho thợ hay cùng lắm là "dối sư" mà thôi. Với tư duy của "kỹ sư" thì chừng đó là chưa đủ. Nguyên nhân là bởi có rất nhiều thứ để đảm bảo an toàn người ta cứ nói tuyệt đối vậy, chứ thực ra có rất nhiều thứ vẫn được nếu như bạn "khúc chiết" 1 tẹo.
Ngay như ví dụ code tớ đưa ở trên là đã gặp ngay ví dụ rồi. Document thì bảo C# string là "immutable", tuy nhiên nếu bạn chạy code của tớ chỗ, gán b[0] = 'd' chẳng hạn, rồi print s ra thấy kết quả là "dbc" ngay, nào phải "immutable" đâu.
string s = "abc";
GCHandle objHandle = GCHandle.Alloc(s, GCHandleType.WeakTrackResurrection);
var address = GCHandle.ToIntPtr(objHandle);
var b = GetInstance<char[]>(address);
b[0]='d';
Console.WriteLine(s);
Nói thế chẳng nhẽ Microsoft nó document không chính xác. Cũng chưa hẳn vậy, mà là phải hiểu string chỉ "immutable" với "managed code" thôi chứ nếu "unsafe code" thì không đúng.
Thôi, anh lại văn vở rồi, code đẹp là phải đảm bảo: there is no surprise, tức là người đọc code ko cần phải đi quá sâu vào implementation details để hiểu đc code của anh, có như vậy thì code mới dễ maintain, mới scale đc.
H cứ mỗi lần viết code mới, thì phải đọc implementation của low-level method, mới biết đc code đó tại sao lại chạy đúng thì chết à? Critical service đang phục vụ cả triệu con người, nó down 1 phát mỗi giây đi cả triệu đô mà code anh như vậy thì debug sao nổi, cty sập cmn tiệm.
zulu
Thôi ông, cái bài mà ông dùng HashSet để giải ở trên thì hên là ông đúng ở trường hợp cụ thể này thôi, và nó ko hơn j chữ :"lách luật, đường tà đạo, thủ thuật mang đi khè nhau"
Khi code mà phải để ý tới cụ thể cách implement bên dưới? Nếu 1 ngày đẹp trời, ver.NET mới nó ko làm như vậy nữa thì sao ông?
Trong khi nguyên lý của HashSet đc định ra là ko đảm bảo theo bất kì 1 thứ tự nào.
Bạn đừng lấy document ra trích dẫn để giải thích, cái đó như tớ đã nói ở trên tớ quan niệm kiểu giải thích như vậy chỉ dành cho thợ hay cùng lắm là "dối sư" mà thôi. Với tư duy của "kỹ sư" thì chừng đó là chưa đủ. Nguyên nhân là bởi có rất nhiều thứ để đảm bảo an toàn người ta cứ nói tuyệt đối vậy, chứ thực ra có rất nhiều thứ vẫn được nếu như bạn "khúc chiết" 1 tẹo.
Ngay như ví dụ code tớ đưa ở trên là đã gặp ngay ví dụ rồi. Document thì bảo C# string là "immutable", tuy nhiên nếu bạn chạy code của tớ chỗ, gán b[0] = 'd' chẳng hạn, rồi print s ra thấy kết quả là "dbc" ngay, nào phải "immutable" đâu.
string s = "abc";
GCHandle objHandle = GCHandle.Alloc(s, GCHandleType.WeakTrackResurrection);
var address = GCHandle.ToIntPtr(objHandle);
var b = GetInstance<char[]>(address);
b[0]='d';
Console.WriteLine(s);
Nói thế chẳng nhẽ Microsoft nó document không chính xác. Cũng chưa hẳn vậy, mà là phải hiểu string chỉ "immutable" với "managed code" thôi chứ nếu "unsafe code" thì không đúng.
Thế làm bài nữa nha,
Input một mảng bất kì chưa sắp xếp
Tìm số lớn nhì của mảng. Chỉ dùng tối đa một dòng for.
input [1,4,5,6,3]
out 5
Đề khi phỏng vấn TMA
dùng python , 1 vòng for , sinh ra array ngẫu nhiên làm đầu vào test cho nhanh đỡ phải nhập mất công
vouu0102
Các thìm cứ cãi nhau cái lib làm gì nhỉ.
Bài toán thì input + output đều có rồi thì cứ print ra thôi. Mô tả bài toán cũng không thì nghĩ làm gì.
Còn nếu so sánh thời gian thì nên dùng độ phức tạp thuật toán để so sánh chứ đừng lôi lib ra làm gì.
thang1812
hồi cách đây 4-5 năm đi pv .net có được hỏi 1 câu là viết lại cái function .Where(f) của thằng LinQ
ngọng líu cmnl, sau về tìm hiểu thấy hay và đáng giá vl, lúc dựng structure mới cho hệ thống dùng cực nhiều
anto_meo
E sắp đi phỏng vấn PHP fresher mà biết mỗi bubble sort, tìm min max, đọc theard này xong chắc thất nghiệp cả đời cmn mất
E sắp đi phỏng vấn PHP fresher mà biết mỗi bubble sort, tìm min max, đọc theard này xong chắc thất nghiệp cả đời cmn mất
Nhiều công ty phỏng vấn cũng không đào sâu cái này, không lo đâu bạn.
Flyyyy
đọc xong tự vã cho bản thân vài cái cho tỉnh
Legion Commander
Làm test auto, vào thớt này chưa đọc hết nhưng may sao cũng làm được bài chuyển số sang chữ với bài số lớn thứ nhì trong 1 vòng for
onib18
Mình biết có một số bạn đánh giá việc trao đổi bên trên về HashMap là không cần thiết, cái đó tuỳ quan điểm mỗi người, mình chia sẻ kinh nghiệm thực tế của mình:
Lần mình đi phỏng vấn vòng onsite của Facebook, có 1 vòng đề coding là tìm số lớn thứ k trong mảng, cái này bạn nào biết về PriorityQueue thì giải khá đơn giản, sau trả lời về độ phức tạp, người phỏng vấn hỏi PriorityQueue implement thế nào mà có độ phức tạp đó.
Lần mình phỏng vấn vòng online của Google, câu hỏi hơi dài nhưng dùng HashMap để tổ chức dữ liệu thì giải khá đơn giản, có câu hỏi kèm theo là độ phức tạp khi truy xuất HashMap và tệ nhất là bao nhiêu, xảy ra khi nào.
Lần mình phỏng vấn ở Grab bên Sing, có 1 câu là nếu không dùng framework có sẵn, mình sẽ tự viết một cái Dependency Injection thế nào ở mức cơ bản.
Những câu này không hẳn công ty nào cũng hỏi, tuỳ đặc thù công việc mà công ty sẽ đánh giá có cần hỏi hay không.
Công việc mình làm hiện tại cũng thế, một cái realtime service dùng mấy cái framework có sẵn không khó, nhưng do đặc thù sản phẩm nặng về performance cần tính tới việc gom nhóm realtime message khi deliver, lúc đó cần viết một thuật toán xử lý gom nhóm cho phù hợp, những bạn chỉ dùng thư viện hoặc không rành về thuật toán thì khi rơi vào tình huống này chắc xử lý hơi khó hoặc không hiệu quả.
vuduc219
nếu luyện leetcode mà phải xem lời giải thì có tiến bộ ko các bác nhỉ, thường 10 bài medium em giải được có 2 bài
((
nếu luyện leetcode mà phải xem lời giải thì có tiến bộ ko các bác nhỉ, thường 10 bài medium em giải được có 2 bài
((
Tuỳ vào expectation của bạn thôi, nhưng có giải được, có luyện là tốt rồi. Người ta nói "Văn ôn võ luyện". Bạn có luyện giải, có đọc lời giải là có tăng được khả năng giải thuật. Mình nghĩ theo thời gian thì nên cố tăng tỉ lệ giải trước khi đọc lời giải ^^.
Mình biết có một số bạn đánh giá việc trao đổi bên trên về HashMap là không cần thiết, cái đó tuỳ quan điểm mỗi người, mình chia sẻ kinh nghiệm thực tế của mình:
Lần mình đi phỏng vấn vòng onsite của Facebook, có 1 vòng đề coding là tìm số lớn thứ k trong mảng, cái này bạn nào biết về PriorityQueue thì giải khá đơn giản, sau trả lời về độ phức tạp, người phỏng vấn hỏi PriorityQueue implement thế nào mà có độ phức tạp đó.
Lần mình phỏng vấn vòng online của Google, câu hỏi hơi dài nhưng dùng HashMap để tổ chức dữ liệu thì giải khá đơn giản, có câu hỏi kèm theo là độ phức tạp khi truy xuất HashMap và tệ nhất là bao nhiêu, xảy ra khi nào.
Lần mình phỏng vấn ở Grab bên Sing, có 1 câu là nếu không dùng framework có sẵn, mình sẽ tự viết một cái Dependency Injection thế nào ở mức cơ bản.
Những câu này không hẳn công ty nào cũng hỏi, tuỳ đặc thù công việc mà công ty sẽ đánh giá có cần hỏi hay không.
Công việc mình làm hiện tại cũng thế, một cái realtime service dùng mấy cái framework có sẵn không khó, nhưng do đặc thù sản phẩm nặng về performance cần tính tới việc gom nhóm realtime message khi deliver, lúc đó cần viết một thuật toán xử lý gom nhóm cho phù hợp, những bạn chỉ dùng thư viện hoặc không rành về thuật toán thì khi rơi vào tình huống này chắc xử lý hơi khó hoặc không hiệu quả.
Công ty nào kể ví dụ được không thím ? Mình toàn phải test coding challenge.
Orient , Bosch , Nashtech ,TMA , Saigon Technology,... hỏi cả bạn bè tôi cũng chả có ai từng làm coding test cả. Hoặc có thể do mảng. Bên tôi là mảng web.
Orient , Bosch , Nashtech ,TMA , Saigon Technology,... hỏi cả bạn bè tôi cũng chả có ai từng làm coding test cả. Hoặc có thể do mảng. Bên tôi là mảng web.
Nói thẳng chút thím đừng tự ái, mấy công ty đó không phải top.
bibooboo
car park (window sliding)
middle node of linked list (2 pointers hoặc array): hồi trước gà làm array, đúng nhưng vẫn bị cho tạch
priority queue: ko biết làm
find max value in array in lexicographically order : xài dictionary
1 cơ số bài nữa mà quên rồi
Nói thẳng chút thím đừng tự ái, mấy công ty đó không phải top.
Tôi cũng biết ko phải top , nhưng ý muốn ns pv IT ko bắt buộc phải có coding challenge vẫn có thể có mức lương khá. Còn muốn lương lên mức top thì nó có thể nghĩ ra vô vàng thứ giống bọn FAANG.