程序员面试宝典部分第四版针对字符数组处理的部分程序

xiaoxiao2021-02-27  259

#include <unistd.h> #include <sys/types.h> #include <iostream> #include <stdlib.h> #include <stdio.h> #include <string> #include <string.h> using namespace std; /********************************** *程序员面试宝典上的关于字符串处理的例程 *page241-243 ************************************/ ///可以用于查找重复出现的最长的字符串 #if 0 int main() { string str("yyabcdabjcabceg"); string tep; cout<<"请输入字符串"<<endl; int len = str.length(); printf("len=%d\n",len); for(int i=str.length()-1; i>1; i--){ for(int j=0; j<str.length();j++){ if((j+i)<=str.length()){ size_t t=0; size_t num=0; tep=str.substr(j,i); t=str.find(tep); num=str.rfind(tep); cout<<"tep= "<<i<<" "<<j<<" "<<tep<<" "<<t<<" "<<num<<endl; if(t!=num){ cout<<tep<<" "<<t+1<<endl; return 0; } } } } return 0; } #endif ///模拟字符串处理函数strstr的处理过程,strstr函数是返回主串中与子串重合的部分及其之后的部分 #if 0 const char* my_strstr(const char* stringsrc,const char* strCharSet) { for(int i=0;stringsrc[i]!='\0';i++){ int j=0; int tmp=i; if(strCharSet[j]==stringsrc[i]){ while(strCharSet[j++]==stringsrc[i++]){ if(strCharSet[j]=='\0'){ return &stringsrc[i-j]; } } } i=tmp; } return NULL; } int main() { char *stringsrc="12345554555123"; cout<<stringsrc<<endl; char strCharSet[10]={0}; //cin>>strCharSet; //cout<<my_strstr(stringsrc,strCharSet)<<endl; cout<<my_strstr(stringsrc,"234")<<endl; return 0; } #endif ///把字符串的顺序进行倒转 #if 0 int main() { int num=-123,j=0,i=0,flag=0,begin=0,end=0; char str[]="i come from tianjin.",temp; j=strlen(str)-1; printf("string=%s\n",str); ///第一步:进行全部翻转 while(j>i){ temp=str[i]; str[i]=str[j]; str[j]=temp; i++; j--; } printf("string first= %s\n",str); ///第二阶段:不是空格的单词进行翻转 i=0; while(str[i]){ ///第一步:先计算出每个单词的起始位置和终点位置 if(str[i]!=' '){ begin=i; while(str[i]&&str[i]!=' '){ i++; } i=i-1; end=i; } ///第二步:实现翻转 while(end>begin){ temp=str[begin]; str[begin]=str[end]; str[end]=temp; begin++; end--; } i++; } printf("string second= %s\n",str); return 0; } #endif ///转换字符串格式为原来字符串的字符+该字符连续出现的个数 #if 0 int main(int argc,char *argv[]) { cout<<"输入数字字符"<<endl; string str("1233422222"); char reschar[50]; reschar[0]='\0'; //getline(cin,str); //cin>>str; int len=str.length(); int count=1; int k=0; for(k=0;k<len;k++){ if(str[k+1]==str[k]){ count++; }else { sprintf(reschar+strlen(reschar),"%c%d",str[k],count); count=1; } } if(str[k]==-str[k-1]){ count++; }else { count=1; } sprintf(reschar+sizeof(reschar),"%c%d",reschar,count); cout<<reschar<<"gg"<<endl; cout<<endl; return 0; } #endif ///三种方法求解把一个char组成的字符串循环右移m个后的结果 #if 0 void fun(char *w,int m) { int i=0,len=strlen(w); if(m>len) m=len; while((len-m >0)||(m=0)!=0){ for(i=0,w[len]=w[0],++m;i<len;i++){ w[i]=w[i+1]; } } w[len-m]='\0'; } void LoopMove1(char *pStr,int steps) { int n=strlen(pStr)-steps; char tmp[50]={0}; strcpy(tmp,pStr+n); strcpy(tmp+steps,pStr); *(tmp+strlen(pStr))='\0'; strcpy(pStr,tmp); } void LoopMove2(char *pStr,int steps) { int n=strlen(pStr)-steps; char tmp[50]; memcpy(tmp,pStr+n,steps); memcpy(pStr+steps,pStr,n); memcpy(pStr,tmp,steps); } int main() { char str[]="ABCDEF"; int m=3; //fun(str,m); //LoopMove1(str,m); LoopMove2(str,m); printf("%s\n",str); return 0; } #endif // 0 ///把数字数组转化为字符串 /*int main(int argc,char **argv) { int num=12345,i=0,j=0; char temp[7]={0}; char str[7]={0}; int number=12345; char str_itoa[15]={0}; while(num){ temp[i]=num+'0'; num=num/10; i++; } temp[i]='\0'; printf("temp=%s\n",temp); i=i-1; while(i>=0){ str[j]=temp[i]; j++; i--; } str[j]='\0'; printf("str=%s\n",str); itoa(number,str_itoa,10); printf("str_itoa=%s\n",str_itoa); return 0; }*/ ///查看字符串s1是否是字符串s2翻转而来的 /*bool checkReverseEqual(std::string s1, std::string s2) { int size1 = s1.size(); int size2 = s2.size(); if(size1 == 0 || size2 == 0){ return false; }//if std::string str = s1 + s1; std::cout<<" "<<str<<std::endl; if(str.find(s2) == -1){ return false; }//if return true; } int main(int argc,char *argv) { std::string str1("waterbottle"); std::string str2("erbottlewat"); bool recv; recv=checkReverseEqual(str1,str2); if(recv){ printf("true\n"); }else if(!recv){ printf("false\n"); } }*/ /* int Index(string s,string p,int pos) {     int i=pos;     int j=0;     int len_s=s.length();     int len_p=p.length();     while(i<=len_s && j<=len_p){         if(s[i]==p[j]){             ++i;             ++j;         }else{             i=i-j+2;             j=0;         }     }     printf("i=%d,j=%d\n",i,j);     if(j>len_p){         return (i-j);     }else{         return 0;     } } void GetNext(string P, int next[]) ///优化前next计算结果 { int p_len = P.size(); int i = 0; //P的下标 int j = -1; next[0] = -1; while (i < p_len) { if (j == -1 || P[i] == P[j]) { i++; j++; next[i] = j; printf("j1=%d\n",j); } else{ j = next[j]; printf("j2=%d\n",j); } } for(i=0;i<p_len;i++){ printf("%d ",next[i]); } printf("\n"); } void GetNextval(string P, int nextval[]) ///优化后的next()结果 { int p_len = P.size(); int i = 0; //P的下标 int j = -1; nextval[0] = -1; while (i < p_len) { if (j == -1 || P[i] == P[j]) { i++; j++; if (P[i] != P[j]) nextval[i] = j; else nextval[i] = nextval[j]; //既然相同就继续往前找真前缀 } else j = nextval[j]; } printf("NextValue= "); for(i=0;i<p_len;i++){ printf("%d ",nextval[i]); } } // 在S中找到P第一次出现的位置 int KMP(string S, string P, int next[]) { //GetNext(P, next); GetNextval(P,next); int i = 0; //S的下标 int j = 0; //P的下标 int s_len = S.size(); int p_len = P.size(); while (i < s_len && j < p_len) { if (j == -1 || S[i] == P[j]) //P的第一个字符不匹配或S[i] == P[j] { i++; j++; } else j = next[j]; //当前字符匹配失败,进行跳转 } if (j == p_len) //匹配成功 return i - j; return -1; } int main() { int next[100] = { 0 }; //cout << KMP("bbc abcdab abcdabcdabde", "abcdabd", next) << endl; //15 GetNext("ababaabab", next); GetNextval("ababaabab", next); string s("abcdef");     string p("def");     int index=Index(s,p,1);     printf("index=%d\n",index); return 0; }*/ ///牛牛颜色区分 #if 0 int main() { string str; while(cin >> str) { int num = 0; printf("len=%d\n",str.length()); for(int i = 0; i < str.length()-1; i++) { if(str[i] == str[i + 1]) { num++; i++; } } cout << num << endl; } return 0; } #endif // 0
转载请注明原文地址: https://www.6miu.com/read-15502.html

最新回复(0)