Procházet zdrojové kódy

Adding even faster solution for 2788

Vinicius Teshima před 1 měsícem
rodič
revize
102ad4546a
1 změnil soubory, kde provedl 30 přidání a 35 odebrání
  1. 30 35
      C/2788.c

+ 30 - 35
C/2788.c

@@ -14,50 +14,42 @@ splitWordsBySeparator(char** words, int wordsSize, char separator,
         unsigned long cap;
         unsigned long size;
     } ret = {0};
+    char buf[21] = {0};
 
     ret.cap = wordsSize;
-    ret.data = calloc(ret.cap, sizeof(*ret.data));
-
     for ( int i = 0; i < wordsSize; ++i ) {
         char *cstr = words[i];
+        while ( *cstr != '\0' ) {
+            ret.cap += ( *cstr == separator );
+            ++cstr;
+        }
+    }
+    ret.data = malloc((ret.cap+1) * sizeof(*ret.data));
+    memset(ret.data, 0, (ret.cap+1) * sizeof(*ret.data));
+
+    ret.size = 0;
+    for ( int i = 0; i < wordsSize; ++i ) {
         unsigned long wsize = 0;
-        unsigned long wcap = 32;
+
+        char *cstr = words[i];
         while ( *cstr != '\0' ) {
             if ( *cstr == separator ) {
-                if ( wsize > 0 ) {
-                    ret.data[ret.size][wsize++] = 0;
-                    ++ret.size;
-                }
-                wsize = 0;
-                wcap = 32;
-                if ( ret.size >= ret.cap ) {
-                    ret.cap *= 2;
-                    ret.data = realloc(ret.data, sizeof(*ret.data) * ret.cap);
-                    for ( unsigned long j = ret.size; j < ret.cap; ++j ) {
-                        ret.data[j] = NULL;
-                    }
-                }
                 ++cstr;
+                if ( wsize == 0 ) { continue; }
+                ret.data[ret.size] = calloc(wsize + 1, sizeof(char));
+                memcpy(ret.data[ret.size], buf, wsize);
+                ++ret.size;
+                wsize = 0;
                 continue;
             }
-            if ( ret.data[ret.size] == NULL ) { ret.data[ret.size] = malloc(wcap); }
-            ret.data[ret.size][wsize++] = *cstr;
-            if ( wsize >= wcap ) {
-                wcap *= 2;
-                ret.data[ret.size] = realloc(ret.data[ret.size], wcap);
-            }
+            buf[wsize++] = *cstr;
             ++cstr;
         }
-        if ( wsize != 0 ) {
-            ret.data[ret.size++][wsize++] = 0;
-            if ( ret.size >= ret.cap ) {
-                ret.cap *= 2;
-                ret.data = realloc(ret.data, sizeof(*ret.data) * ret.cap);
-                for ( unsigned long j = ret.size; j < ret.cap; ++j ) {
-                    ret.data[j] = NULL;
-                }
-            }
-        }
+
+        if ( wsize == 0 ) { continue; }
+        ret.data[ret.size] = calloc(wsize + 1, sizeof(char));
+        memcpy(ret.data[ret.size], buf, wsize);
+        ++ret.size;
     }
 
     *returnSize = ret.size;
@@ -68,15 +60,18 @@ void
 r(char **ws, int s, char sep)
 {
     int ret_size = 0;
-    char **ret = splitWordsBySeparator(ws, s, sep, &ret_size);
+    char **retorig = splitWordsBySeparator(ws, s, sep, &ret_size);
     printf("RetSize = %d\n", ret_size);
-    if ( ret == NULL ) return;
+    if ( retorig == NULL ) return;
+    char **ret = retorig;
 
     printf("Ret = [");
     while ( *ret != NULL ) {
-        printf("\"%s\", ", *ret++);
+        printf("\"%s\", ", *ret);
+        free(*ret++);
     }
     printf("]\n");
+    free(retorig);
 }
 
 int