程序员面试宝典部分第四版针对字符数组处理的部分程序
2017-08-30 22:54
218 查看
#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%10+'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
相关文章推荐
- 《C语言及程序设计》程序阅读——字符数组与字符串处理
- 《C语言及程序设计》程序填空——字符数组与字符串处理
- HDU 3518 Boring counting(后缀数组,字符处理)
- C语言练习 字符数组处理
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 编写程序,生成一种贯穿10*10字符数组(初始时全为字符'.')的“随机步法”。程序必须随机地从一个元素“走到”另一个元素,每次都向上、向下、向左或向右移动一个元素位置
- 你好,C++(23) 4.4.2 工资程序成长记:用数组处理批量数据,用循环结构执行重复动作
- 根据服务器端返回的字符数组,展示字符串标签,需要涉及字符串长度处理以及字符串换行,字符串不够一行自动跳到第二行的逻辑
- 数组处理函数(获取字符数组中一定长度的字符,修改字符数组的某个字符)
- LR随手一记 字符数组处理,转换成参数,赋值
- linux字符处理命令 sort(部分转载)
- HDU 1062.Text Reverse【栈或数组或字符串流】【字符处理】【8月30】
- 关于字符数组的一个有意思的程序
- (转载)你好,C++(23) 4.4.2 工资程序成长记:用数组处理批量数据,用循环结构执行重复动作
- 基于VS针对opencv图像处理的可执行程序打包
- 在C# WinForm程序中创建控件数组及相应的事件处理
- Java 文件统计:编写程序,统计英文文本文件中的字符数目和单词数目。程序运行时,输入要统计的文件的名称,程序处理后输出字符数目和单词数目
- 将整数转换为相应的一个字符数组。 分析:从个位提取数字,组合字符 符号位的处理 12345=>"12345"
- 一个字符数组,里面的字符可能是a-z、A-Z、0-9.现在要求对数组进行排序,要求所有小写字符放在最前面,所有大写字符放在中间,所有数字放在最后,而且各部分内部分别有序。
- 字符串处理——删除字符中的abc字符程序