Tópico: Inversão de palavras
Descrição: Inverte todas as palavras da string.
ilustrar:
1. Os caracteres que compõem uma palavra são apenas 26 letras maiúsculas ou minúsculas do inglês;
2. Os caracteres que não constituem palavra são considerados separadores de palavras;
3. O separador de palavras após a inversão deve ser representado por um espaço, se houver vários separadores entre palavras adjacentes na string original, apenas um separador de espaço será permitido após a conversão da inversão;
4. Cada palavra pode ter até 20 letras.
Intervalo de dados: o comprimento da string satisfaz 1≤n≤10000;
Insira a descrição:
Insira uma linha para representar a frase usada para inversão
Descrição da saída:
Produza o resultado invertido da frase
Exemplo um:
Entrada: Eu sou um estudante
Resultado: aluno a sou eu
Exemplo dois:
Importar: $bo*y gi!r#l
Saída: lr gi y bo
Ideias para resolução de problemas:
1. A ideia geral é o método de ponteiro duplo , que define um par de ponteiros rápidos e lentos; rápido e lento;
2. Encontre o final da letra: primeiro deixe fast apontar para o elemento final da matriz e, em seguida, encontre o final da letra de trás para frente. Quando arr[fast] não é uma letra , rápido - até apontar para a letra, e então deixe lento = rápido . Neste momento, lento aponta para o final da carta;
3. Encontre o cabeçalho da carta: quando arr[fast] for uma carta, use fast-- até apontar para uma não-letra e, em seguida, imprima o valor entre arr[fast+1] até arr[slow] , seguido por um separador;
Implementação da ideia:
Primeiro insira a string porque ela contém espaços, então scanf não é fácil de usar. Use get , use a função de string strlen para calcular o número real da matriz e, em seguida, defina os ponteiros duplos rápido e lento e atribua-os;
#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 , percorra o array de trás para frente e imprima;
Encontre o final da letra: primeiro deixe fast apontar para o elemento final da matriz e, em seguida, encontre o final da letra de trás para frente. Quando arr[fast] não é uma letra , fast-- até apontar para o carta, e então deixe slow = fast , neste momento slow aponta para o final da carta;
while(fast>=0 && !isalpha(arr[fast]))
{
fast--;
}
slow=fast;
Encontre o cabeçalho da carta: quando arr[fast] é uma letra, fast-- , até apontar para uma não letra, então imprima o valor entre arr[fast+1] até arr[slow] , adicione um separador depois dele, e imprimir;
while(fast>=0 && isalpha(arr[fast]))
{
fast--;
}
int i=0;
for(i=fast+1;i<=slow;i++)
{
printf("%c",arr[i]);
}
printf(" ");
O texto acima é a análise desta questão. Aqui está o código-fonte do 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;
}
Se houver alguma deficiência, fique à vontade para complementar e comunicar!
fim. . .