`
v5qqbrowser
  • 浏览: 358236 次
文章分类
社区版块
存档分类
最新评论

程序员面试100题(算法)之翻转句子中单词的顺序

 
阅读更多

方法一:

// 程序员面试100题(算法)之翻转句子中单词的顺序

#include "stdafx.h"  
#include<iostream>  

using namespace std;  

void reverse(char* begin, char* end)  
{  
    if ((begin == NULL) || (end == NULL))  
        return ;

	char temp;
    while (begin < end)  
    {  
		temp = *begin;
		*begin = *end;
		*end = temp; 
        ++begin;  
        --end;  
    }  
} 
  
char *reverseSentence(char *pData)  
{  
    if(NULL == pData)  
        return NULL;  
  
    char *begin = pData;  
    char *end = pData;  
  
    while(*end != '\0')  
    {  
        end++;  
    }  
  
    end--;  
    //reverse the overall sentence  
    reverse(begin, end);  
  
    //reverse each word in the reversed sentence  
    begin = pData;  
    end = pData;  
  
    while(*begin != '\0')  
    {  
        if(*begin == ' ')  
        {  
            begin++;  
            end++;  
            continue;  
        }  
  
        if(*end == ' ' || *end == '\0')  
        {  
            end--;  
            reverse(begin, end);  
            end++;  
            begin = end;  
        }  
        else  
        {  
            end++;  
        }  
    }  
  
    return pData;  
}  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    char sentence[] = "I am in China today!! I am very happy!!!!";  
    char *newSentence = NULL;  

    newSentence = reverseSentence(sentence);  
	cout << newSentence << endl;

    return 0;  
}  


方法二:(用异或实现反转)

#include "stdafx.h"
#include <iostream>
#include <cstring>  

using namespace std;
  
void Reverse(char* b, char* e)  
{  
    if ((b == NULL) || (e == NULL))  
        return ;  

    while (b < e)  
    {  
        *b ^= *e;  
        *e ^= *b;  
        *b ^= *e;  
        ++b;  
        --e;  
    }  
}  
  
void WordReverse(char* s)  
{  
    if (s == NULL)  
        return; 

    Reverse(s, s + strlen(s) - 1);  

    char* b = s;  
    char* e = s;  
    while(*e)  
    {  
        if (*e == ' ')  
        {  
            Reverse(b, e - 1);  
            ++e;  
            b = e;  
        }  
        else  
            ++e;  
    }  

    Reverse(b, e - 1);  
}  

int _tmain(int argc, _TCHAR* argv[])
{
    char my[] = "I am a student";  
    Reverse(my, my + strlen(my) - 1);  
    cout << my << endl;  

    char my2[] = "I    am   a   student   ";  
    WordReverse(my2);  
    cout << my2 << endl;  

	return 0;
}


附:

1、递归逆置字符串

char *recurReverse(char* s, int left, int right)
{
	if(left >= right)
		return s;

	char c = s[left];
	s[left] = s[right];
	s[right] = c;

	recurReverse(s, left + 1, right - 1);
}

2、普通的字符串逆置,申请新的空间,然后逆序复制过去。

char *commonReverse(char* s)  
{  
	if(NULL == s)
	{
		return NULL;
	}

	char *end = s;

	while(*end != '\0')
	{
		end++;
	}

	end--;
	char *newStr = (char*)malloc(sizeof(char) * (strlen(s) + 1));
	char *str = newStr;

	while(end != s)
	{
		*newStr = *end;
		end--;
		newStr++;
	}

	*newStr = *end;
	*(++newStr) = '\0';

	return str;
} 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics