同样是出自《程序员面试攻略》的几个经典问题,是关于字符串的。
    问题1:编写一个高效函数,从一个字符串中删除一些字符(这些要删除的字符组成一个小字符串,它包含的任何字符都要从原字符串中删除)。
    [分析:利用一个数组,该数组的下标为字符的ASCII值,来存储字符的状态,如果是要被删除的字符,则相应的数组元素置为true。然后通过遍历这个原字符串,对其中的每个字符检查其对应数组元素的状态。此处状态数组可理解为一种hash关系]
void RemoveChars(char * str, char * remove)
{
    int len = strlen(remove);
    int i = 0, pos = 0;
 
    for(i = 0; i < len; i++)
    {
        flags[(int)remove[i]] = true;
    }
    i = 0;
    len = strlen(str);
    while(i < len)
    {
        if(!flags[(int)str[i]])
        {
             str[pos++] = str[i];
        }
        i++;
    }
}
 
    问题2:编写一个函数,反转一个字符串中单词的顺序。“hello world!”-->“world!hello”
    [分析:大体思路为先将待处理字符串整体反转,意思为最后一个字符与第一个字符互换,依次类推。然后在从头查找每一个单词,对每个单词进行反转操作]
void ReverseString(char str[], int start, int end)
{
    char temp;
    while(end > start)
    {
        temp = str[start];
        str[start] = str[end;
        str[end] = temp;
  
        start++;
        end--;
    }
}
 
void ReverseWords(char str[])
{
    int start = 0, end = 0, length;
    length = strlen(str);
 
    ReverseString(str, start, length-1);
 
    while( end < length)
    {
        if(str[end] != ' ')
        {
            start = end;
            while(end < length && str[end] != ' ')
            {
                 end++;
            }
   
            end--;
            ReverseString(str, start, end);
        }
        end++;
    }
}