面试出了一个题,要求逆序字符串中的单词,比如" My Name Is Tom ",原字符串变成“ Tom Is Name My ”,以空格为单词之间的间隔,可能有多个空格,不考虑其他字符,空间复杂度为O(1)。
方法:先将原字符串完全逆序,即变成" moT sI emaN yM ",然后再对每个单词进行逆序,代码如下:
#include <Windows.h>
#include <iostream>
using namespace std;
void fun(char* str)
{
char* head = str;
char* p = str;
while(*p != '\0')
{
p ++;
}
p--;
char* tail = p;
while(head < p)
{
char c = *head;
*head = *p;
*p = c;
head++;
p--;
}
head = str;
p = NULL;
while(head != tail+1)
{
if (*head == ' ')
{
if (!p)
{
head++;
continue;
}
else
{
char* temp = head - 1;
while(p<temp)
{
char c = *p;
*p = *temp;
*temp = c;
p++;
temp--;
}
p = NULL;
continue;
}
}
if (!p)
{
p = head;
}
else
{
head ++;
continue;
}
}
}
int main()
{
char *a = new char[50];
ZeroMemory(a, 50);
memcpy(a, " My Name Is Tom ", sizeof(" My Name Is Tom "));
cout<<a<<endl;
fun(a);
cout<<a<<endl;
delete []a;
}
程序运行结果: