字符串

stycpy函数:

c语言中的函数,需要头文件:<stdio.h>和<string.h>。

char *stycpy(char *dest,const char* src);

把src地址开始且含有null结束符的字符串复制到以dest开始的地址空间。

 

sprintf函数:

c语言中的函数,需要头文件<stdio.h>。

int sprintf(char *buffer,const char*format,[argument]..);

把格式化的数据写入某个字符串缓冲区,返回字符串的长度。

eg:n=sprintf(buffer,"%d plus %d is %d",a,b,a+b);

 

题目1:给出一个字符串,把其中的空格全部替换成%20.

这题需要问清楚面试官是在原数组的基础上进行替换,还是建立一个新的字符串。

然后如果从头到尾去扫描空格,则需要进行多次的复制,算法复杂度为O(n^2)。

改成从尾到头去扫描空格。首先扫描字符串的数目以及空格的数目,然后把新字符串的总长度计算出来。设置指针p1和p2分别指向元字符串的末尾、新字符串的末尾。然后在没有遇到空格

的时候,就复制,遇到空格的时候就替换。直到两个指针相重合。

#include<stdio.h>

void sapce_replace(char *string_input)    //在原字符串上替换,保证原字符串有足够多的空间
{
    if(string_input==NULL)  //特殊情况的考虑,字符串为空。
        return;
    int string_length,spaces_num;
    for(string_length=0,spaces_num=0;*string_input!='\0';string_input++,string_length++)
    {
        if(*string_input==' ')
            spaces_num++;
    }
    if(spaces_num==0)   //特殊情况的考虑,没有空格的情况。
        return;
    string_length+=1;   //\0也要占用空间
    char *p1=string_input;    //p1指向‘\0’
    char *p2=p1+2*spaces_num;   //p2指向新字符串的末尾
    while(p1!=p2)
    {
        if(*p1!=' ')
        {
            *p2=*p1;
            p2--;
            p1--;
        }
        else
        {
            *p2='0';
            *(--p2)='2';
            *(--p2)='%';
            --p2;
            --p1;
        }
    }
}

void main()
{
    char input[100]="We are family!";
    sapce_replace(input);
    printf("%s",input);
}

 

题目2:找到一个字符串中的无重合字符子串的最大长度。

思路非常简单:从头到尾搜索原字符串s。把和s_sub没有重合的字符加入到s_sub中,如果出现了重合的字符,就把s_sub中重合字符及其前面的字符全部删除,加入当前字符。

计算当前s_sub的长度,如果比历史的最大不重合子串长度maxlength大,就更新maxlength值。

#include <iostream>
#include<string>
using namespace std;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int maxlength=0;
        string s_sub;
        for(int i=0;i<s.length();i++)
        {
            string::size_type position=s_sub.find(s[i]);    //查找s[i]在s_sub中的位置
            if(position!=s_sub.npos)     //找到了和sub重合的位置
            {
                s_sub=s_sub.substr(position+1,s_sub.size()-position-1);    //把重合的字符及前面的字符都删掉
                s_sub+=s[i];        //然后把当前字符加进去
            }
            else       //如果和前面的没有重合,就把该字符加到子字符串中
            {
                s_sub+=s[i];
            }
            if(s_sub.length()>maxlength)    //如果子字符串的长度比之前找到的最大长度大,就更新最大长度的值。
                maxlength=s_sub.length();
        }
        return maxlength;
    }
};

void main()
{
    Solution sol;
    string s="afhafuhgrjfusfhurwfhuewfsd";
    cout<<sol.lengtOfLongestSubstring(s);
}

 

题目3:第一个只出现一次的字母

思路1:建立一个大小为256的栈,新来一个字母和栈中所有字母进行比较,如果重合就从栈中删除该字母,搜索完成后栈底的字母即为最后的字母。复杂度为O(N^2),不好。

思路2:为每个字母建立一个哈希表,key为字母,value为字母出现的次数。表的大小为256。用数组实现。

拓展:如果需要判断多个字符是不是在某个字符串里出现过或者统计多个字符在某个字符串中出现的次数,可以考虑基于数组创建一个简单的哈希表。

posted @ 2015-06-10 22:41  wy1290939507  阅读(132)  评论(0编辑  收藏  举报