Dadas algunas líneas de texto en una string, cada línea está separada por el carácter ‘\n’. Imprime las últimas diez líneas. Si el número de líneas es inferior a 10, imprima todas las líneas. Fuente: Entrevista de Microsoft | Set 10 Los siguientes son los pasos
1) Encuentre la última aparición de DELIM o ‘\n’
2) Inicialice la posición de destino como la última aparición de ‘\n’ y cuente como 0, y siga mientras cuenta <10
2.a) Encuentre la siguiente instancia de ‘\n’ y actualice la posición de destino
2.b) Omita ‘\n’ e incremente el conteo de ‘\n’ y actualice la posición de destino 3) Imprima la substring desde la posición de destino.
C++
// C++ Program to print the last 10 lines. // If number of lines is less than 10, // then print all lines. #include <bits/stdc++.h> using namespace std; #define DELIM '\n' /* Function to print last n lines of a given string */ void print_last_lines(char *str, int n) { /* Base case */ if (n <= 0) return; size_t cnt = 0; // To store count of '\n' or DELIM char *target_pos = NULL; // To store the output position in str /* Step 1: Find the last occurrence of DELIM or '\n' */ target_pos = strrchr(str, DELIM); /* Error if '\n' is not present at all */ if (target_pos == NULL) { cout << "ERROR: string doesn't contain '\\n' character\n"; return; } /* Step 2: Find the target position from where we need to print the string */ while (cnt < n) { // Step 2.a: Find the next instance of '\n' while (str < target_pos && *target_pos != DELIM) --target_pos; /* Step 2.b: skip '\n' and increment count of '\n' */ if (*target_pos == DELIM) --target_pos, ++cnt; /* str < target_pos means str has less than 10 '\n' characters, so break from loop */ else break; } /* In while loop, target_pos is decremented 2 times, that's why target_pos + 2 */ if (str < target_pos) target_pos += 2; // Step 3: Print the string from target_pos cout << target_pos << endl; } // Driver Code int main(void) { char *str1 ="str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7\nstr8\nstr9" "\nstr10\nstr11\nstr12\nstr13\nstr14\nstr15\nstr16\nstr17" "\nstr18\nstr19\nstr20\nstr21\nstr22\nstr23\nstr24\nstr25"; char *str2 ="str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7"; char *str3 ="\n"; char *str4 = ""; print_last_lines(str1, 10); cout << "-----------------\n"; print_last_lines(str2, 10); cout << "-----------------\n"; print_last_lines(str3, 10); cout << "-----------------\n";; print_last_lines(str4, 10); cout << "-----------------\n"; return 0; } // This is code is contributed by rathbhupendra
C
/* Program to print the last 10 lines. If number of lines is less than 10, then print all lines. */ #include <stdio.h> #include <string.h> #define DELIM '\n' /* Function to print last n lines of a given string */ void print_last_lines(char *str, int n) { /* Base case */ if (n <= 0) return; size_t cnt = 0; // To store count of '\n' or DELIM char *target_pos = NULL; // To store the output position in str /* Step 1: Find the last occurrence of DELIM or '\n' */ target_pos = strrchr(str, DELIM); /* Error if '\n' is not present at all */ if (target_pos == NULL) { fprintf(stderr, "ERROR: string doesn't contain '\\n' character\n"); return; } /* Step 2: Find the target position from where we need to print the string */ while (cnt < n) { // Step 2.a: Find the next instance of '\n' while (str < target_pos && *target_pos != DELIM) --target_pos; /* Step 2.b: skip '\n' and increment count of '\n' */ if (*target_pos == DELIM) --target_pos, ++cnt; /* str < target_pos means str has less than 10 '\n' characters, so break from loop */ else break; } /* In while loop, target_pos is decremented 2 times, that's why target_pos + 2 */ if (str < target_pos) target_pos += 2; // Step 3: Print the string from target_pos printf("%s\n", target_pos); } // Driver program to test above function int main(void) { char *str1 = "str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7\nstr8\nstr9" "\nstr10\nstr11\nstr12\nstr13\nstr14\nstr15\nstr16\nstr17" "\nstr18\nstr19\nstr20\nstr21\nstr22\nstr23\nstr24\nstr25"; char *str2 = "str1\nstr2\nstr3\nstr4\nstr5\nstr6\nstr7"; char *str3 = "\n"; char *str4 = ""; print_last_lines(str1, 10); printf("-----------------\n"); print_last_lines(str2, 10); printf("-----------------\n"); print_last_lines(str3, 10); printf("-----------------\n"); print_last_lines(str4, 10); printf("-----------------\n"); return 0; }
Producción:
str16 str17 str18 str19 str20 str21 str22 str23 str24 str25 ----------------- str1 str2 str3 str4 str5 str6 str7 ----------------- ----------------- ERROR: string doesn't contain '\n' character -----------------
Complejidad de tiempo: O(n)
Espacio Auxiliar: O(1)
Nota: El programa anterior se puede modificar para imprimir las últimas N líneas pasando N en lugar de 10. N puede almacenar cualquier valor entero. Este artículo fue compilado por Narendra Kangralkar . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA