2025-03-31 03:07:03
提供一个思路,代码分成两步,第一翻转整个字符串,第二部翻转单词。
#include<iostream>
#include<string.h>
#include<assert.h>
using namespace std;
/*
* 这是2015年大数据云计算工程师百度校招的题目
* 题目说不适用任何库函数,实现英语文章的逆序输出,
* 也就是最后一个单词变成第一个单词,以此类推.
* 以下为程序实现.
* */
/*第一种方法,严格意义上说使用了new操作符*/
char* reverse(char * word);
/*另外一种策略,严格意义上说其调用了求解字符串长度的库函数,需要自行实现这个函数*/
void Reverse(char *pbegin,char *pend);
char *ReverseSentence(char *str);
int main()
{
char temp[] = {"There are so many sth."};
cout<<ReverseSentence(temp)<<endl;
return 0;
}
char* reverse(char * word)
{
int length = -1;
int count = 0;
int index=0;
while(word[++length] != '\0');
cout<<length<<endl;
char *temp = new char[length + 1];
for(int i = length - 1; i >= 0; i --)
{
if (word[i] != ' ')
{
count++;
continue;
}
for(int j = i + 1; j < count + i + 1; j++)
{
temp[index++] = word[j];
}
count = 0;
temp[index++] = ' ';
}
count = 0;
while(word[count] != ' ')
{
temp[index++] = word[count];
count++;
}
temp[index] = '\0';
return temp;
}
void Reverse(char *pbegin,char *pend)
{
if(pbegin==NULL||pend==NULL)
return;
while(pbegin<pend)
{
char tmp;
tmp=*pbegin;
*pbegin=*pend;
*pend=tmp;
++pbegin;
--pend;
}
}
char *ReverseSentence(char *str)
{
assert(str!=NULL);
Reverse(str,str+strlen(str)-1);
char *base=str;
int WordLen=0;
char *WordBase=str;
while(*str!='\0')
{
if(*str!=' ')
++WordLen;
else
{
Reverse(WordBase,WordBase+WordLen-1);
WordLen=0;
WordBase=str+1;
}
str++;
}
Reverse(WordBase,WordBase+WordLen-1);
return base;
}
2025-03-31 01:58:25
可以用后进先出的栈来处理,这是最简单、高效的方式。简单说,就是遇到空格就入栈前面的单词,到最后,依次出栈,所以,最后入栈就是最后出栈的,而且不用反转单词,比楼下诸位的代码效率都要高很多。必看代码长,很简单,不懂加QQ 2544632890 。完整代码如下(gcc调试通过):
#include <stdio.h>
#define MAXCNT 20//这是最大单词个数,这里是20
typedef struct
{
char *words[MAXCNT];//这是存储各个单词的指针的数组
int top;//这是最近访问的单词在数组中的下标,指向最后一个单词
}Stack,*PStack;//这样定义了两个数据类型,一个是一个栈,另一个则是指向这种类型的指针
void push(char *p,PStack s)
{
if(s->top==MAXCNT-1)//已经访问到最后一个数组空间,即存满了20个单词,出错
return;
else//否则top向后移动一位,并记下指针
{
s->top++;
s->words[s->top]=p;
}
}
char *pop(PStack s)
{
s->top--;//这里让top向前移动一位,但返回的时候是返回它后面那个数组空间的值,所以下面这句加1
return s->words[s->top+1];
}
int main(void)
{
char str[50]="I am a happy student!";//这里随便什么都行
char *pch=str;
Stack s;
s.top=-1;//开始时没有一个单词,所以,要为-1
push(pch,&s);//默认第一个是单词,因此将其先入栈,不是空格,否则出错
while(*pch!='\0')//遍历字符串
{
if(*pch!=' ')
{
pch++;//在单词内部,向后移指针
}
else//已到单词末尾,将空格改为字符串结束标志,以此分割单词
{
*pch='\0';
pch++;
push(pch,&s);//将新单词指针入栈
}
}
while(s.top!=-1)//依次出栈输出
{
printf("%s ",pop(&s));
}
return 0;
}
2025-03-31 01:51:07
#include <iostream>
#include <string>
using namespace std;
void InverseString(char* p, char* q){
while(q-p >= 1){
*p = *p^*q;
*q = *p^*q;
*p = *p^*q;
p++;
q--;
}
}
int main()
{
char str[] = "I come from tianjian.";
int iStrLen = strlen(str);
InverseString(str,str+strlen(str)-1);
char *p = str;
char *q = str;
while (*p != '\0')
{
if (*p == ' '){
InverseString(q,p-1);
q = p+1;
}
p++;
}
printf(str);printf("\n");
return 0;
}
2025-03-31 03:14:14
就是像输入: I am so happy.
输出:happy. so am I
#include <stdio.h>
#include <string.h>
int main()
{
char str[100];
char *p;
gets(str);
p=strrchr(str, ' ');
while( p )
{
*p='\0';
p++;
printf("%s ", p );
p=strrchr(str, ' ');
}
printf("%s\n", str );
return 0;
}
老师不让用#include
p=strrchr(str, ' ');
类似这种的- -。。。我也蛋疼不知道怎么做。
#include <stdio.h>
int main()
{
char str[100];
char *p=str;
gets(str);
while( *p ) p++ ;
while( p!=str )
{
p--;
if ( *p == ' ' )
{
*p='\0';
if ( *(p+1) )
printf("%s", p+1 );
printf(" ");
}
}
if ( str[0] )
printf("%s\n", str );
return 0;
}