【华为OJ】【031-单词倒排】

题目描述

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

说明:

1、每个单词是以26个大写或小写英文字母构成;

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

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

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

输入描述:

输入一行以空格来分隔的句子

输出描述:

输出句子的逆序

示例1

输入

I am a student

输出

student a am I

本题考查知识点:字符串

本题难度:初级

#include <stdlib.h>
#include <string.h>
#include "oj.h"


/*
功能:
     对字符串中的所有单词进行倒排。
    
输入:
    char* pInput:给定的单词串
    
输出:
    char* pOutput:倒排后的单词串
     
返回:
    int:成功0,失败-1
     
*/

int Converse(char* pInput, char* pOutput)
{
	char b[100];
	char pOutput1[100];
	int len = strlen(pInput);
	int * a = (int *)malloc(len*sizeof(int));
	char* poutput = (char *)malloc(len*sizeof(char));
	int num = 0;
	int count = 0;
	for(int i = 0;i<len;i++)
	{
		if((pInput[i] >= 'a'&&pInput[i] <= 'z') || (pInput[i] >= 'A'&&pInput[i] <= 'Z'))
		{
			b[i] = pInput[i];
		}
		else
		{
			b[i] = ' ';
		}
		
	}
	
	 for(int i = 0;i<=len;i++)
	{
		if((b[i] == ' ')&&(b[i+1]) == ' ')
		{
			for(int j = i;j<len;j++)
			{
				b[j] = b[j+1];
				
			}
			len--;
			i--;
		}
	
	}
	b[len] = ' ';
    for(int i = 0;i<=len;i++)
	{
		if((b[i] == ' ')&&(b[i+1]) != ' ')
		{
			a[++count] = i;//记录每个空格的位置,和空格数量
			//count++;//注意:count++与++count的区别,count++导致a[count]=-842150451
		}
	
	}
	for(int i = count;i > 1;i--)
	{
		memcpy(poutput,b+a[i-1],a[i]-a[i-1]);
		for(int j = 0;j<(a[i]-a[i-1]);j++)
		{
			pOutput1[num++] = poutput[j];
		}
		
		//pOutput =  
	}
	pOutput1[num] = ' ';//结束符'\0'与' '空格不同
	for(int i = 0;i<len;i++)
	{
		if(pInput[i] != ' ')
		{
			pOutput1[++num] = pInput[i];
			break;
		}
	}
	for(int i = 0;i<len;i++)
	{
		pOutput[i] = pOutput1[i+1];
	}
		
	
	return 0;
}

第二种方法:同样runtimeerror

int Converse(char* pInput, char* pOutput)
{
	/*string str;
	str = pInput;//可以对str直接赋值
	string temp;
	for(int i=0;i<str.length;i++)
	{
		if(str[i] != ' '&&str[i] != '\0')
		{
			temp += str[i];
		}
		else
		{
			
		}
	}*/
	int flag =0,count=0;
	char dic[20][20];
	char *poutput;
	int len = strlen(pInput),word = 0,num = 0;
	for(int i = 0;i<len;i++)
	{
		if((pInput[i] >= 'a'&&pInput[i] <= 'z') || (pInput[i] >= 'A'&&pInput[i] <= 'Z'))
		{
			flag = 1;
			dic[word][num++] = pInput[i];
		}
		else
		{
			if(flag == 1)
			{
				dic[word][num] = '\0';
				num = 0;
				//dic[word][num] = ' ';
				//dic[word][num] = '\0';
				word++;
				flag = 0;
			}
		}
	}	
	dic[word][num] = '\0';
	for(int i = word;i>=0;i--)
	{
		if(dic[i][0] != '\0')
		{
			poutput = dic[i];

		}
		int len1 = strlen(poutput);
		for(int j = 0;j<len1;j++)
		{
			pOutput[count++] = poutput[j];
		}
		if(i != 0)
		pOutput[count++] = ' ';
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值