Bị segment fault khi giải bài sparse arrays trên hackerrank

chào mọi người. em đang luyện tập bài Sparse Arrays trên hackerRank. đề bài nó như dưới đây:

đề bài




em làm theo cách so sánh từng string trong querry với trong array. khi chạy thì bị lỗi segment fault. dưới đây là code của em:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
    int array_count,query_count;
  
    //nhập vào array
    scanf("%d", &array_count);

    char **array=malloc(array_count*sizeof(char *));
    for (int i = 0; i < array_count; i++)
    {
        array[i]=malloc(30*sizeof(char));
        fgets(array[i], 30, stdin);
    }

    //nhập vào query
    scanf("%d", &query_count);

    int count[query_count];
    char **query=malloc(query_count*sizeof(char *));
    for (int i = 0; i < query_count; i++)
    {
        query[i]=malloc(30*sizeof(char));
        fgets(query[i], 30, stdin);
    }

    // so từng string trong query với trong array
    for (int i = 0; i < query_count; i++)
    {
        for (int j = 0; j < array_count; j++)
        {
            if(strcmp(array[j], query[i])) ++count[i];
        }
        printf("%d", count[i]);
    }

    free(array);
    free(query);
    return 0;
}

P/s: mọi người có cách làm tối ưu hơn không cho em tham khảo với. cảm ơn mọi người nhiều

Nó chỉ yêu cầu bạn thực hiện 1 hàm với tên và tham số là: matchingStrings(strings, queries) thôi mà. Đâu cần phải viết cả main() và nhập/xuất đâu.

C++
// Complete the matchingStrings function below.
vector<int> matchingStrings(vector<string> strings, vector<string> queries) {
    // Thực hiện ở đây!
}

C:

// Complete the matchingStrings function below.

// Please store the size of the integer array to be returned in result_count pointer. For example,
// int a[3] = {1, 2, 3};
//
// *result_count = 3;
//
// return a;
//
int* matchingStrings(int strings_count, char** strings, int queries_count, char** queries, int* result_count) {


}
4 Likes

@SITUVN.gcd ban đầu em viết trong hàm đấy thấy bị lỗi nên tạo file làm lại

Bạn chạy mã của bạn trên HackerRank luôn à?

  1. Bạn cho chuỗi nhập vào chỉ có 30 kí tự thôi. Mình thấy chuỗi bên hàm readline() của HackerRank tối đa lên đến 1024.
  2. Họ đã làm đơn giản hóa cho bạn, việc của bạn chỉ cần tìm trong chuỗi và trả về kết quả. Không phải nhập/xuất lằng nhằng.
4 Likes

không, cái code bên trên em để 30 kí tự là để tìm xem lỗi chỗ nào thôi, chứ còn trên hackerrank em viết cái hàm cũng bị seg fault

Tham khảo nhé:

int* matchingStrings(int strings_count, char** strings, int queries_count, char** queries, int* result_count) {
    int* r = malloc(queries_count*sizeof(int));
    *result_count = queries_count;
    for(int i = 0; i < queries_count; ++i){
        r[i] = 0;
        for(int j = 0; j < strings_count; ++j){
            r[i]+=!(strcmp(*(strings+j), *(queries+i)));
        }
    }
    return r;
}

:unamused:

Mình thấy gán biến result_count dư thừa phết! Có bao nhiêu queries_count thì kết quả có bấy nhiêu.

4 Likes

cho em hỏi thêm, có cách nào tối ưu hơn không ạ? em thấy cách này phải lặp hơi nhiều

Thế là ổn rồi. Tối ưu gì nữa.

  • Sắp xếp.
  • Bảng tần suất.

:crazy_face:

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?