您的位置:首页 > 职场人生

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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐