首页 > 试题广场 >

单词倒排

[编程题]单词倒排
  • 热度指数:365722 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

对字符串中的所有单词进行倒排。

说明:

1、构成单词的字符只有26个大写或小写英文字母;

2、非构成单词的字符均视为单词间隔符;

3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;

4、每个单词最长20个字母;

数据范围:字符串长度满足

输入描述:

输入一行,表示用来倒排的句子



输出描述:

输出句子的倒排结果

示例1

输入

I am a student

输出

student a am I
示例2

输入

$bo*y gi!r#l

输出

l r gi y bo
#include <stdio.h>
#include<string.h>
#include<assert.h>
#include<ctype.h>

void reverse(char*left,char*right)
{
    assert(left&&right);
    while(left<right)
    {
        char ch=*left;
        *left=*right;
        *right=ch;
        left++;
        right--;
    }

}

int main() {
    char str[10001]={0};//确保有结束标志
    int i=0;
    char ch;
    int flag=0;
    while((ch=getchar())!=EOF)
    {
        if(isalpha(ch))
        {
            str[i++]=ch;
            flag=1;
        }
        else
        {
            if(flag==1)
            {
                if(ch!='\n')//最后一个回车不读进去
                {
                    str[i++]=' ';
                    flag=0;
                }
             
            }
        }
    }
    int len=strlen(str);
    reverse(str,str+len-1);
    char* begin=str;
    char* end=str;
    while(*end!='\0')
    {
        begin=end;
        if(isalpha(*end))
        {
            while(isalpha(*end))
            {
                end++;
            }
            reverse(begin,end-1);
        }
        else {
        end++;
        }
    }
    printf("%s",str);
    return 0;
}
编辑于 2024-03-31 17:56:53 回复(0)
#include <stdio.h>
#include <string.h>
int main() {
    char str[10001];
    gets(str);
    int len=strlen(str);
    for(int i=0;i<len;i++)
    {
        if(str[i]>='A'&&str[i]<='Z') ;
        else if(str[i]>='a'&&str[i]<='z') ;
        else
            str[i]=' ';
        if(i>0&&str[i]==' '&&(str[i-1]==' '||str[i-1]==EOF))
            str[i]=EOF;
    }
    int a=len-1,b=len-1;/*用a标示每个空格的位置*/
    while(a>=0)
    {
        while(str[a]!=' '&&a>=0)
            a--;
        for(int j=a+1;j<=b;j++)
        {
            if(str[j]==EOF)
                continue;
            printf("%c",str[j]);
        }
        if(a>0)
            printf(" ");
        a--;
        b=a;
    }
    return 0;
}

编辑于 2024-03-12 22:06:24 回复(0)
#include<stdio.h>
#include<string.h>
char check(char t)
{
    if((t>='a'&&t<='z')||(t>='A'&&t<='Z'))
    {
        return 1;
    }
    else{
        return 0;
    }
}
int main()
{
    char str[1000];
    int len,i,j,head,tail,flag;
    scanf("%[^\n]",&str);
    len = strlen(str);
    head = tail = flag = len;
    for(i = len-1;i>=0;i--)
    {
        if(i==len-1&&check(str[i]))
        {
            tail = i;
            //printf("%d ",tail);
        }
         if(check(str[i])&&!check(str[i+1])&&i!=len-1)
        {
            tail = i;
            //printf("%d ",tail);
        }
         if(check(str[i])&&i==0)
        {
            head = i;
            //printf("%d ",head);
        }
         if(check(str[i])&&!check(str[i-1])&&i!=0)
        {
            head = i;
            //printf("%d ",head);
        }
        if(head<=tail&&tail<flag)
        {
            for(j=head;j<=tail;j++)
            {
                printf("%c",str[j]);
            }
            head = tail = len;
            printf(" ");
            flag = tail;
        }

    }
    return 0;
}
编辑于 2024-03-07 21:46:35 回复(0)
写的又臭又长啊
# define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
# include<string.h>
int main()
{
    char input[10001] = { 0 };
    gets(input);
    int sz = strlen(input);
    for (int i = 0; i < sz; i++)
    {
        if (input[i] < 'A' || input[i]>'Z' && input[i] < 'a' || input[i]>'z')
        {
            input[i] = ' ';
        }
    }
    char* first = input;
    char* last = &input[0] + (sz-1);
    char temp = 0;
    while (last > first)
    {
        temp = *first;
        *first = *last;
        *last = temp;
        last--;
        first++;
    }
    char* start = input;
    char* end = input;
    char* temp2 = { NULL };
    temp = 0;
    for (int i = 0; i < sz; i++)
    {
        if (*end != ' '&&*end !='\0')
        {
            end++;
        }
        else
        {
            temp2 = end;
            while ((end-1) > start)
            {
                temp = *start;
                *start = *(end-1);
                *(end-1) = temp;
                end--;
                start++;
            }
            start = temp2 + 1;
            end = temp2 + 1;
        }
    }
    while ((end - 1) > start)
    {
        temp = *start;
        *start = *(end - 1);
        *(end - 1) = temp;
        end--;
        start++;
    }
    printf("%s", input);
    return 0;
}


编辑于 2024-02-23 16:48:32 回复(0)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    char arr[2000] = { 0 };
    long long b = 0;
    int arr1[1000] = { 0 };
    for (long long i = 0; i < 2000; i++)
    {
        scanf("%c", &arr[i]);
        if (arr[i] < 65 || arr[i]>122)
        {
            b++;
            arr1[b] = i+1;
            
        }
        if (arr[i] == '\n')
        {
            break;
        }
    }
    long long a = b;
    while (a)
    {
        long long i = 0;
        for (i = arr1[b - 1]; i < arr1[b]-1; i++)
        {
            printf("%c", arr[i]);
        }
        printf(" ");
        a--;
        b--;
    }
    return 0;
}
发表于 2024-01-11 13:16:24 回复(1)
#include <ctype.h>
#include <stdio.h>
#include <string.h>
int main() {
    char s[10000];
    gets(s);
    int k = strlen(s), kong[10000] = {0}, m = 0;
    for (int i = 0; i < k; i++) {    //剔除杂符号 换为空格
        if (isupper(s[i])) continue;
        else if (islower(s[i])) continue;
        else s[i] = ' ';
    }
    char ns[10000] = {'\0'};        // 剔除多余空格,记录空格的位置
    for (int i = 0, j = 0, b = 1; i < k; i++) {
        if (s[i] != ' ') {ns[j++] = s[i];b = 1;} 
        else {
            if (b) {kong[m++] = j;ns[j++] = s[i];}
            b = 0;
        }
    }                           //以上处理ns中有m个空格 存在kong[]中 开始打印
    if (m == 0)puts(ns);
    else {
        for (int i = strlen(ns)-1, j = m-1; j >= 0; j--) {
            for (k = kong[j]+1 ; k <=i ; k++) putchar(ns[k]);
            putchar(' ');
            i = kong[j]-1 ;
        }
    }
    for (k = 0; k < kong[0]; k++)putchar(ns[k]);
    return 0;
    }

编辑于 2023-12-02 18:08:59 回复(0)
1.思路:
(1)字符串中有空格,故整个字符串用gets获取
(2)遍历字符串的每个字符,将非字母的字符位置填 '\0'
(3)再次从整个字符串的末尾往前遍历,遇到i处为\0,而i+1处非\0时,i+1处即可打印一个字符串
(4)注意从后往前遍历,记得最终把第一个单词也打印一下
2.注意事项:
(1)记得保留原始字符串的字符个数,循环时对len--了,第二个循环容易错用len。
(2)注意临时指针不要指错。
#include <stdio.h>
#include <string.h>
int main() {
    char str[10001]={0};
    int len,chr_count;
    char *ptmp;
    gets(str);
    chr_count = len = strlen(str);
    //去除特殊字符
    while(len--)
    {
        if((str[len] < 'A' || str[len] > 'Z') && (str[len] < 'a' || str[len] > 'z'))
        {
            str[len] = '\0';
        }
    }

    ptmp = str;
    while(chr_count--)
    {
        if((ptmp[chr_count] == '\0') && (ptmp[chr_count+1] != '\0'))
        {
            printf("%s ", &ptmp[chr_count+1]);
        }
    }
    printf("%s\n",str);
    return 0;
}


发表于 2023-11-25 22:38:48 回复(0)
#include <ctype.h>
#include <stdio.h>
#include <string.h>

int main() {
    char str[10001] = {'\0'};
    gets(str);
    int len = strlen(str);
    int flag = 0;
    for(int i  = len-1;i>=0;i--)
    {
        //判断是否是字母,且只出现一次非字母
        if(!isalpha(str[i])&&flag == 0)
        {
            printf("%s ",&str[i+1]);
            str[i] = '\0';
            flag = 1;
        }
        else if(isalpha(str[i])&&flag==1)
        {
            flag = 0;
        }
    }
    //如果最后flag还是0表示还需要打印最后一个字母字符串
    if(flag == 0)
    {
        printf("%s",str);
    }
    printf("\n");
    return 0;
}
发表于 2023-10-10 12:49:39 回复(0)
#include <stdio.h>
#include <string.h>
//思路:寻找非英文字母,若其后一个为英文字母则开始输出,否则不输出
int isEnglish(char c) { //判断是否为英文字母
    int flag = 0;
    if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) //是
        flag = 1;
    else//不是
        flag = 0;
    return flag;
}
int main() {
    char str[10001] = {0};
    gets(str);
    int len = strlen(str);
    for (int i = len - 1; i >= 0; i--) {
        if (isEnglish(str[i]) == 0 && isEnglish(str[i + 1]) == 1) {
            int j = i + 1;
            while (isEnglish(str[j]) == 1) {
                //一个单词
                printf("%c", str[j]);
                j++;
            }
            printf(" ");
        }
    }
    //第一个字符为字母
    if (isEnglish(str[0]) == 1) {
        printf("%c", str[0]);
        int j = 1;
        while (isEnglish(str[j]) == 1) {
            //一个单词
            printf("%c", str[j]);
            j++;
        }
    }
    return 0;
}
发表于 2023-09-03 20:45:53 回复(0)
#include <stdio.h>
#include <string.h>
int main(){
    char s[10001];
    int len,i;
    gets(s);
    len=strlen(s);
    for(i=len-1;i>=0;i--)
    {
        if(!(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z'))
        {
            printf("%s ",&s[i+1]);
            s[i]='\0';
        }
    }
    printf("%s",&s[0]);
    return 0;
}
发表于 2023-07-30 22:50:39 回复(0)
#include <stdio.h>
//扫描字符串。如果是英文,则将其写入二维数组当中, 遇到非英文,写入截止符号\0。倒序输出二维数组,中间穿插空格即可。
//flag == 0即为写入英文状态, 1即为当前是间隔符。
int main() {
    char c, str[100][21];
    int i = 0, j = 0, flag = 0;
    /*扫描字符串*/
    while(scanf("%c", &c) != EOF){
        /*大写*/
        if(c >= 'A' && c <= 'Z'){
            str[i][j++] = c;
            flag = 0;
        }
        /*小写*/
        else if(c >= 'a' && c <= 'z'){
            str[i][j++] = c;
            flag = 0;
        }
        /*第1个非英文*/
        else if(flag == 0){
            str[i++][j] = '\0';  //换行
            j = 0;  //列号归零
            flag = 1;
        }
    }
    /*输出*/
    for(i=i-1; i>=0; i--)  //while循环结束后i==行数
        printf("%s ", str[i]);
    return 0;
}

发表于 2023-07-08 17:23:16 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    char str[10001] = {};
    gets(str);
    int len = strlen(str);
    int word_len = 0;
    int flag = 0;     //多个间隔符时,倒排转换后只允许出现一个空格间隔符

    //从后往前遍历,遇到字母计算单词长度,遇到其他字符就打印
    for (int i = len - 1; i >= 0; i--) {
        if (isalpha(str[i])) {
            word_len++;
            flag = 1;
            continue;
        } else {
            if (flag == 1) {
                for (int j = i + 1; j < i + 1 + word_len; j++) {
                    printf("%c", str[j]);
                }
                printf(" ");
                flag = 0;
                word_len = 0;
            }
        }
    }

    //打印最后一个单词
    if (isalpha(str[0])) {
        for (int i = 0; i < word_len; i++)
            printf("%c", str[i]);
    }

    return 0;
}

发表于 2023-02-25 21:01:56 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void reverse(char* start, char* end){       //用于反转整个字符串
    char tmp;
    while(start < end){
        tmp = *start;
        *start = *end;
        *end = tmp;
        start++, end--;
    }
}
//用于将end-start的字符,逐个赋值给dst,并更新dstLen
void copyReverseToDst(char* start, char* end, char* dst, int* dstlen){
    while(end >= start){
        *dst++ = *end--;
        (*dstlen)++;
    }
}

int main() {
    char input[10001];
    char* ret = (char*)malloc(sizeof(char)*10001);      //为返回值申请空间
    int retLen = 0;
    int len, start, end;
    gets(input);
    len = strlen(input);
    reverse(&input[0], &input[len-1]);  //翻转整个字符串
    start = end = 0;    
    while(1){
        while((input[end]>='a'&&input[end]<='z') || (input[end]>='A'&&input[end]<='Z'))end++;   //找到完整单词的下一位
        copyReverseToDst(&input[start], &input[end-1], &ret[retLen], &retLen);  //将该单词反转赋值到dst,注意end-1,因此此时end指向的是单词的下一位,即结束符
        ret[retLen++] = ' ';    //间隔
        while(end < len && !((input[end]>='a'&&input[end]<='z') || (input[end]>='A'&&input[end]<='Z')))end++;   //找到下一个单词的起始,虽然这里用end来移动,但是end会赋值给start
        if(end >= len)break;    //如果end超过最大输入长度,则表示倒排结束
        start = end;
    }
    ret[retLen] = '\0'; //结束符
    printf("%s", ret);
    free(ret);
    return 0;
}


发表于 2023-02-14 14:22:46 回复(0)
#include <stdio.h>

int my_strlen(char* s)
{
	int i = 0;
	while (*s != 0)
	{
		i++;
		s++;
	}
	return i;
}

void voit(char* s)
{
	while (*s != 0)
	{
		if ((*s >= 'A' && *s <= 'Z') || (*s >= 'a' && *s <= 'z')){}
		else
		{
			*s = ' ';
		}
		*s++;
	}
}

void down(char* s, int n, int m)
{
	while (n < m)
	{
		char i = s[n];
		s[n] = s[m];
		s[m] = i;
		n++;
		m--;
	}
}

void rever(char* s, int n)
{
	int m = 0;
	char* a = s;
	for (int i = 0; i <= n; i++, a++)
	{
		if (*a == ' ' || *a == 0)
		{
			down(s, m, i - 1);
			m = i + 1;
		}
	}
}
int main()
{
	char s[10000];

	scanf("%[^\n]", s);
	int n = my_strlen(s);

	//转换间隔符
	voit(s);
	//倒排单词
	rever(s, n);
	//倒排句子
	down(s, 0, n - 1);


	printf("%s", s);

	return 0;
}

发表于 2023-01-06 08:21:55 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    char str[500][21] = {0};
    int i = 0;
    while (1) {
        scanf("%[a-z|A-Z]"str[i]);
        if (getchar() == '\n')break;
        i++;
    }
    for (int j = i, flag = 0; j >= 0; j--) {
            printf("%s "str[j]);
    }
}
发表于 2022-11-21 15:08:17 回复(0)
#include <stdio.h>

int main()
{
  char sentence[1100] = {0};
  char *p = sentence + 1;
  
  while(scanf("%s", p) != EOF)
    p += strlen(p) + 1;

  while(p-- > sentence)
  {
    if((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z'))
    {
      p[1] = 0;
      
      while(p--)
        if(((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z')) == 0)  break;
      
      printf("%s ", p + 1);
    }
  }
}

发表于 2022-08-03 22:45:00 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char *str = NULL;
    str = malloc(sizeof(char)*10000);
    if(!str)
    {
        return -1;
    }
    fgets(str,10000,stdin);
    
    int len = strlen(str) - 1;
    int i = 0;
    str[len] = '\0';
    for(i = (len-1); i>= 0; i--)
    {
        if((str[i] < 'a' || str[i] > 'z') && (str[i] < 'A' || str[i] > 'Z') )
        {
            printf("%s",&str[i+1]);
            str[i] = '\0';
            printf(" ");
        }
    }
    printf("%s\n",str);
    free(str);
    str = NULL;
    return 0;
}
发表于 2022-06-16 21:21:26 回复(0)

问题信息

难度:
37条回答 63696浏览

热门推荐

通过挑战的用户

查看代码