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); }
原文:http://www.cnblogs.com/wy1290939507/p/4567695.html