Превышен лимит времени в C

#c

#c

Вопрос:

Я сделал код для вставки элементов в связанный список, который работает должным образом.Затем я написал код для преобразования связанного списка в группы заданного размера.Моя проблема в том, что выполнение моего кода занимает слишком много времени, потому что я хочу оптимизировать этот код.

Например:

ВВОД

 8  //number of elements

1 2 2 4 5 6 7 8  //elements

4  //position to reverse the list elements
  

ВЫВОД

 4 2 2 1 8 7 6 5
  
 struct node *reverse (struct node *head, int k)
{ 
    int count=0,i=0,j=0,a[1000],start=0,end;
    struct node *temp=head;
    struct node *t=head;
    struct node *tt=head;
    while(temp!=NULL)
    {
        temp=temp->next;
        count  ;
    }
    while(count!=0)
    {
    while((k--)amp;amp;(t!=NULL))
    {
        a[i  ]=t->data;
        t=t->next;
    }
    end=i-1;
    while(start<end)
    {
       int temp=a[start];
       a[start]=a[end];
       a[end]=temp;
       start  ;
       end--;
    }
    while(tt->next!=t)
    {
        tt->data=a[j];
        j  ;
        tt=tt->next;
    }
    tt->data=a[j];
    count=count-k;
    i=0;
    j=0;
    }
    return head;
}
  

Комментарии:

1. Есть ли какая-либо причина, по которой вы реализуете связанный список для того, что вы можете хранить в простом массиве? Просто сохраните числа в массиве и поменяйте местами фрагменты массива. a[1000] вы даже сохраняете данные в массиве, переворачиваете их, а затем возвращаетесь в связанный список. И почему a[1000] ? Почему бы и нет a[1002] ? Пожалуйста, напишите MCVE, как node объявляется? Как вызывается функция? Вы не считываете никаких входных данных и ничего не выводите из кода? Пожалуйста, опубликуйте полный воспроизводимый пример, который можно скомпилировать. .

2. TLE означает, что, к сожалению, решение недостаточно хорошее. Довольно часто с проблемами «онлайн-оценки» очевидное решение не будет достаточно быстрым, и реальная проблема заключается в том, чтобы найти хороший алгоритм и эффективно его закодировать.

Ответ №1:

Необходимый код буквально равен 6!! строки длиной

Вот вам мой пример

 #include <stdio.h>

void reverse(int *first, int *last)
{
    int tmp;

    while(first < last)
    {
        tmp = *first;
        *first   = *last;
        *last-- = tmp;
    }
}


void reverseFromPos(int *arr, size_t len, size_t pos)
{
    reverse(amp;arr[0], amp;arr[pos - 1]);
    reverse(amp;arr[pos], amp;arr[len -1]);
}

int main()
{
    int arr[] = {1,2,3,4,5,6,7,8, 9};
    size_t len;

    reverseFromPos(arr, len =sizeof(arr) / sizeof(arr[0]), 4);
    for(size_t index = 0; index < len; index  )
        printf("%d ", arr[index]);
    printf("n");

    return 0;
}