字符串

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.lengthOfLongestSubstring(s);

}
复制代码

你可能感兴趣的:(字符串)