Tema: Inversión de palabras
Descripción: Invierte todas las palabras de la cadena.
ilustrar:
1. Los caracteres que componen una palabra son sólo 26 letras inglesas mayúsculas o minúsculas;
2. Los caracteres que no constituyen una palabra se consideran separadores de palabras;
3. El separador de palabras después de la inversión debe estar representado por un espacio; si hay varios separadores entre palabras adyacentes en la cadena original, solo se permite un separador de espacio después de la conversión de inversión;
4. Cada palabra puede tener hasta 20 letras.
Rango de datos: la longitud de la cadena satisface 1≤n≤10000;
Introduzca la descripción:
Ingrese una línea para representar la oración utilizada para la inversión.
Descripción de salida:
Genera el resultado invertido de la oración.
Ejemplo uno:
Entrada: soy estudiante
Salida: estudiante a soy yo
Ejemplo dos:
Importar: $bo*y gi!r#l
Salida: lr gi y bo
Ideas para resolver problemas:
1. La idea general es el método de doble puntero , que define un par de punteros rápidos y lentos: rápido y lento;
2. Encuentre la cola de la letra: primero deje que fast apunte al elemento de la cola de la matriz, y luego busque la cola de la letra de atrás hacia adelante. Cuando arr[fast] no es una letra , fast-- hasta que apunte a la letra, y luego let slow = fast En este momento, slow apunta al final de la letra;
3. Busque el encabezado de la carta: cuando arr[fast] es una letra, use fast-- hasta que apunte a algo que no sea una letra y luego imprima el valor entre arr[fast+1] y arr[slow] , seguido de un separador;
Implementación de ideas:
Primero ingrese la cadena porque contiene espacios, por lo que scanf no es fácil de usar. Use get y use la función de cadena strlen para calcular el número real de la matriz. Luego defina los punteros dobles rápidos y lentos y asígnelos;
#include<string.h>
int main() {
char arr[10001]={0};
gets(arr);
int len=strlen(arr);
int fast=len-1;
int slow=0;
fast=len-1 , recorre la matriz de atrás hacia adelante e imprime;
Encuentre el final de la letra: primero deje que fast apunte al elemento final de la matriz y luego busque el final de la letra de atrás hacia adelante. Cuando arr[fast] no es una letra , fast-- hasta que apunte a la letra, y luego let slow = fast , en este momento slow apunta al final de la letra;
while(fast>=0 && !isalpha(arr[fast]))
{
fast--;
}
slow=fast;
Busque el membrete: cuando arr[fast] es una letra, fast-- , hasta que apunte a algo que no sea letra, luego imprima el valor entre arr[fast+1] y arr[slow] , agregue un separador después. e imprimir;
while(fast>=0 && isalpha(arr[fast]))
{
fast--;
}
int i=0;
for(i=fast+1;i<=slow;i++)
{
printf("%c",arr[i]);
}
printf(" ");
Lo anterior es el análisis de esta pregunta, aquí está el código fuente del programa:
#include <stdio.h>
#include<string.h>
int main() {
char arr[10001]={0};
gets(arr);
int len=strlen(arr);
int fast=len-1;
int slow=0;
while(fast>=0)
{
while(fast>=0 && !isalpha(arr[fast]))
{
fast--;
}
slow=fast;
while(fast>=0 && isalpha(arr[fast]))
{
fast--;
}
int i=0;
for(i=fast+1;i<=slow;i++)
{
printf("%c",arr[i]);
}
printf(" ");
}
return 0;
}
Si hay alguna deficiencia, ¡no dude en complementarla y comunicarla!
fin. . .