在程序员面试的过程当中,很多时候都会问到对字符串的操作,其中包括:字符串的逆序,字符串的最大字串,字符串按单词逆序,两个字符串的最大公共子串,记录字符串中某字符出现的次数,对字符串进行去重,找出第一个不重复的字符,字符串中是否含有回文字串,最长回文字串等等很多的问题。还有一些就是实现strcpy函数,memcpy函数,这个针对字符串的问题在面试过程中真的是千奇百怪,什么类型的都有。当然相对来说比较好做,但是当遇到一些限定条件之后就相对会难一些了,比如说空间,时间的限制。
今天我们先来看下这样一道题:就是书写strcpy的源代码:
char * strcpy(char *dest,char *src)
{
char *d=dest;//这个地方要注意
if(src==NULL||dest==NULL)
{
return NULL;
}
while(*src!='\0')
{
*dest=*src;
dest++;
src++;
}
*dest='\0';//还有这里
return d;//最后返回的是d
}
下面我们来看下字符串逆序中,句子逆序,但是单词不逆序的问题:
#include "stdafx.h"
#include <stdio.h>
#include <string>
#include<iostream>
#include <stdlib.h>
using namespace std;
void Reverse(char *pBegin, char *pEnd)
{
if(pBegin == NULL || pEnd == NULL)
return;
while(pBegin < pEnd)
{
char temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
pBegin ++;
pEnd --;
}
}
///
// Reverse the word order in a sentence, but maintain the character
// order inside a word
// Input: pData - the sentence to be reversed
///
char * ReverseSentence(char *pData)
{
if(pData == NULL)
return NULL;
char *pBegin = pData;
char *pEnd = pData;
while(*pEnd != '\0')
pEnd ++;
pEnd--;
// Reverse the whole sentence
Reverse(pBegin, pEnd);
// Reverse every word in the sentence
pBegin = pEnd = pData;
while(*pBegin != '\0')
{
if(*pBegin == ' ')
{
pBegin ++;
pEnd ++;
continue;
}
// A word is between with pBegin and pEnd, reverse it
else if(*pEnd == ' ' || *pEnd == '\0')
{
Reverse(pBegin, --pEnd);
pBegin = ++(++pEnd);
}
else
{
pEnd ++;
}
}
return pData;
}
void main()
{
char *a="I am a Student";//注意这个地方,如果这样定义的话,可以实现吗?这样是不行因为这样定义的是常量字符串。会出现问题。应该定义为数组! char a[]="I am a Student"
cout<<"a:a::"<<a<<endl;
char *b=ReverseSentence(a);
printf("%s",b);
}
上述问题的基本思想就是:先将整个句子逆序,然后在遇到空格的时候,对每个单词再次逆序,就行了!