Một bạn, có vẻ như đang cay cú, đăng câu hỏi này và nói rằng “thằng em” ở dãy trọ không làm được bài này nhưng lại deal được lương 8tr.Bạn đang xem: Tìm số lớn thứ 2 trong mảng

https://vozforums.com/showthread.php?t=4971101

Nếu là các bạn, với đề “viết 1 hàm tìm số có giá trị lớn thứ 2 trong dãy số cho trước” thì bạn sẽ giải như thế nào?

Chú ý là đề chỉ bao gồm viết 1 hàm tìm số có giá trị lớn thứ 2 trong dãy số cho trước, không có yêu cầu gì khác.

Bạn đang xem: Tìm số lớn thứ 2 trong mảng

Đạt có 2 cách giải bài này. Một cách lúc còn đi học và một cách lúc đã đi làm. Đạt sẽ chia sẻ sau.

Update, đã chia sẻ ở đây. Gạch đá nào
*

*

Bạn sẽ "viết 1 hàm tìm số có giá trị lớn thứ 2 trong dãy số cho trước" như thế nào? dev chat Cách đó cũng ổn, nhưng có cách tốt hơn, cũng không khó mấy. Ví dụ như cách của nguyenchiemminhvu Vì Đã có câu trả lời của nguyenchiemminhvu nên Đạt chia sẻ thế này. Khi mình đi làm, không có chuyện giới hạn sẽ phải làm trong 1 vòng lặp hay hai vòng lặp. Nhớ một điều là hw thì rẻ mà developer thì mắc. Nếu mình mắc thì nên đáng giá của nó. Mình có giá thì người khác cũng vậy, tức là viết code làm sao để người sau đọc hiểu và code theo nhanh nhất có thể. Lúc đi học có ta có thể viết một hàm … 12 Likes nguyenhuuca (Nguyen Ca) May 12, 2016, 6:25am #2

Cái bài này phỏng vấn bên capegini có nè :D. Và yêu cầu là 1 vòng for.

4 Likes nghia (cescnghia) May 12, 2016, 7:39am #3

1 vòng lập for, mình ko có xử lý trường hợp mảng chỉ có 1 phần tử.

#include #include int function(int* tab, size_t length);int main(void){int tab = {1, -123, 80, 8, 2, 10, 9, 18, -1000, 200, 1, 4};int result = function(tab, 12);printf("Second max in this array : %d\n", result); return 0;}int function(int* tab, size_t length){int max1 = INT_MIN;int max2 = INT_MIN;int i;for(i = 0; i tab && max2 4 Likes nguyenchiemminhvu (...) May 12, 2016, 7:41am #4 Nếu tất cả các phần tử bằng nhau và bằng luôn INT_MIN thì sao

3 Likes ltd (Lê Trần Đạt) May 12, 2016, 7:43am #5

Đề không yêu cầu dùng 1 vòng lặp. Đạt đưa ra câu hỏi để giải quyết vấn đề thực tế ta gặp

viết 1 hàm tìm số có giá trị lớn thứ 2 trong dãy số cho trước

Chứ không đưa ra bất cứ một giới hạn nào.

3 Likes Itachi_Citus (Itachi Citus) May 12, 2016, 7:42am #6

Lúc đầu mình cũng nghĩ bài này giống bạn, đọc lại trên voz mới thấy còn nhiều lỗ hổng

*

:

Trường hợp length Trường hợp toàn bộ mảng bằng nhau không được xử lý.Thuật toán không tổng quát cho trường hợp mảng không phải số nguyên (INT_MIN).Thuật toán không tổng quát cho trường hợp tìm số lớn thứ n.…

Nhìn vậy mà phức tạp hơn tưởng tượng ban đầu

*

3 Likes ktd (Kiều Dũng) May 12, 2016, 7:49am #7

Hi. Mình không xy ly truong hop mang co 1 phan tu nhe.

#include #include int main(){ //int arr_a = {19, 0, 5, 7, 13, 15, 11, 6, 4, 5, 102, 11, 15, 15, 16, 18, 19}; int arr_a = {0,0,0,0,0,0,0}; int max = arr_a; int max2 = 0; int i; //printf("%d", length_array); for (i = 0; i max) { max = arr_a; max2 = arr_a; } else { if (max2 2 Likes nghia (cescnghia) May 12, 2016, 7:50am #8 Ok, đồng ý với bạn. Cần phải giải quyết tất cả các exception !

1 Like tdl May 12, 2016, 7:52am #9

Nếu hàng dùng 1 lần thì

*

for (i = 0; i Smax_denhat){Smax_denhi = Smax_denhat;Smax_denhat = a;}}if (Smax_denhi == Smax_denhat)printf("Mang nay co van de ma tui hong biet van de gi.");Bookmark topic lại để dành

2 Likes nguyenchiemminhvu (...) May 12, 2016, 8:06am #10

Đề không yêu cầu dùng vòng lặp gì thì em dùng vòng lặp while vậy

Sắp xếp mảng giảm dần, xong rồi tìm phần tử khác phần tử thứ nhất đầu tiên thứ nhất.Phải vậy không anh ltd

#include #include #include #include #include using namespace std;void find_max2(vector &v){if (v.empty() || v.size() == 1){cout b; });int i = 0, after_i = i + 1;while (i vec;int n;cout > n;for (int i = 0; i 4 Likes postace (Hai) May 12, 2016, 8:11am #11 Đề bài không giới hạn gì, nên em sẽ dùng cách bình thường nhất :

Tìm maxDuyệt mảng, tìm phần tử lớn thứ 2 2 Likes ltd (Lê Trần Đạt) May 12, 2016, 8:27am #12

Cách đó cũng ổn, nhưng có cách tốt hơn, cũng không khó mấy. Ví dụ như cách của nguyenchiemminhvu

Vì Đã có câu trả lời của nguyenchiemminhvu nên Đạt chia sẻ thế này.

Khi mình đi làm, không có chuyện giới hạn sẽ phải làm trong 1 vòng lặp hay hai vòng lặp. Nhớ một điều là hw thì rẻ mà developer thì mắc.

Nếu mình mắc thì nên đáng giá của nó. Mình có giá thì người khác cũng vậy, tức là viết code làm sao để người sau đọc hiểu và code theo nhanh nhất có thể.

Lúc đi học có ta có thể viết một hàm với rất nhiều if else loạn xạ. Giúp cho chương trình chạy nhanh hơn vài phần triệu giây. Nhưng làm cho developer khác tốn vài phút hoặc 1 ngày hoặc vài ngày chỉ để debug. Vậy có đáng không?

Solution lúc Đạt đi học sẽ là một vòng lặp với nhiều if else, cuối cùng chạy được. Nhưng rất khó hiểu và khó debug.

Solution lúc Đạt đi làm sẽ là xem thử ngôn ngữ có hỗ trợ hàm sort không, vì dụ như C++ STL hỗ trợ std::sort. Hoặc C hỗ trợ qsort. Hãy sử dụng nó, các hàm này là các hàm tối ưu tốt hơn hàm mình tự viết nhiều. Đừng reinvent the wheel.

Xem thêm: Mã Ngành Đại Học Hoa Sen 2020, Mã Ngành, Tổ Hợp Xét Tuyển Đại Học Hoa Sen 2020

Các bước thực hiện như sau:

Sắp sếp giảm dần mảng đã chohàm sort của thư viện sẽ cho ra kết quả tối ưu nhất có thể trong khi ta tốn 1 phút để code dòng code này.kiểm tra từ 1 tới n của mảng, nếu thấy số nhỏ hơn mang thì đó chính là số max thứ 2

Ưu điểm:

Code nhanh, hàm sort tối ưu, logic đơn giản dễ debug.

Nhược điểm

Có thể chậm hơn chương trình if else tá lả vài phần triệu giây

Code C

#include int get_second_max(int * array, int len); int main() { int array = {1,2,9,9,9,3,4,5,7,0}; printf("get_second_max: %d\n", get_second_max(array, 10));} int cmp_int (const void * a, const void * b){ return ( *(int*)b - *(int*)a );} int get_second_max(int * array, int size) { int max; int second_max; int i; qsort (array, size, sizeof (int), cmp_int); max = second_max = array; for(i = 1; i array ) { second_max = array; break; } } return second_max;}Code ++ có thể xem bài của Vũ:


Bạn sẽ "viết 1 hàm tìm số có giá trị lớn thứ 2 trong dãy số cho trước" như thế nào? dev chat Đề không yêu cầu dùng vòng lặp gì thì em dùng vòng lặp while vậy
Sắp xếp mảng giảm dần, xong rồi tìm phần tử khác phần tử thứ nhất đầu tiên thứ nhất. Phải vậy không anh ltd
#include #include #include #include #include using namespace std;void find_max2(vector &v){if (v.empty() || v.size() == 1){cout 7 Likes