2015-11-17 2 views
-1
i am trying to solve leetcode question :- 

https://leetcode.com/problems/largest-number/ Учитывая список не отрицательных целых чисел, расположите их так, чтобы они составляли наибольшее число.Код, указывающий на ошибку во время выполнения?

Например, если в [3, 30, 34, 5, 9] наибольшее сформированное число равно 9534330. Я пытаюсь сортировать строки, определяя компаратор для сравнения строк путем конкатенации справа налево или слева, направо.

Программа дает ошибку времени выполнения. Пожалуйста, помогите ....

int comp(const void* a, const void* b){ 
     int p = *((int *)a); 
     int q = *((int *)b); 
     int size = 14; 
     char * first = (char *)malloc(size * sizeof(char)); 
     char * second = (char *)malloc(size * sizeof(char)); 
     first[0] = "\0"; 
     second[0] = "\0"; 
     sprintf(first, "%d",p); 
     sprintf(first, "%d",q); 
     sprintf(second, "%d",q); 
     sprintf(second, "%d",p); 
     return -1*strcmp(first, second); 
    } 

    char* largestNumber(int* nums, int numsSize) { 
     if(numsSize <=0) 
      return NULL; 
     qsort(nums, numsSize, sizeof(int), comp); 
     char * result = (char*)malloc(numsSize *5*sizeof(char)); 
     int i; 
     for(i=0; i<numsSize; i++) 
      result = strcat(result, nums[i]); 
     return result; 
    } 
+1

Что такое ошибка? – David

+3

«comp» действительно вызывает утечку памяти. – MikeCAT

+1

Вы должны инициализировать буфер, на который указывает 'result', перед тем как передать его в' strcat() '. – MikeCAT

ответ

1
  • Выделяя память с malloc() и выбросить это плохая практика. Поскольку вы всегда выделяете фиксированный объем памяти в comp, используйте обычный массив.
  • Не делайте first[0] = "\0";, которому присваивается указатель на char переменную. Также удалите ненужный sprintf, результат которого скоро будет перезаписан.
  • Выделение 5 байтов для каждого элемента может быть слишком маленьким, если int имеет 4 байта. Выделите больше памяти.
  • Инициализировать буфер, на который указывает result, перед тем как передать его strcat().
  • Конвертировать целое число в строку перед передачей его strcat().
  • Говорят, что you shouldn't cast the result of malloc() in C.

Возможное исправление (не проверено):

int comp(const void* a, const void* b){ 
    int p = *((int *)a); 
    int q = *((int *)b); 
    char first[14]; 
    char second[14]; 
    sprintf(first, "%d", q); 
    sprintf(second, "%d", p); 
    return -1 * strcmp(first, second); 
} 

char* largestNumber(int* nums, int numsSize) { 
    if(numsSize <= 0) 
     return NULL; 
    qsort(nums, numsSize, sizeof(int), comp); 
    char * result = malloc(numsSize * 14 * sizeof(char)); 
    int i; 
    result[0] = '\0'; 
    for(i = 0; i < numsSize; i++) { 
     char num[14]; 
     sprintf(num, "%d", nums[i]); 
     result = strcat(result, num); 
    } 
    return result; 
} 
Смежные вопросы