面试-字符串操作
1. 字符串数与整数之间的转化
void int2str(int num, char *str)
{ char *ptr = str; while(num) { *ptr++ = num%10 + '0';num /= 10;
}
*ptr = '\0';}
int str2int(char *str)
{ int num = 0; char *ptr=str;while(*ptr != '\0')
{ num = num*10 + *ptr -'0';++ptr;
}
return num;}
int main(){ char str[100];int2str(16548964, str);
for(int i = strlen(str)-1; i>=0; --i)
{cout << str[i];
}
char *s="45984336";
cout << "\n" << str2int(s); system("PAUSE"); return 0;}
2. strcpy 和 memcpy
3. 字符串翻转
4. 字符串中单词的翻转
"I am from Shanghai." -> "Shanghai. from am I"
void RevStr(char src[])
{ char *start=src, *end=src, *ptr=src;while(*ptr++ != '\0')
{if(*ptr==' ' || *ptr == '\0')
{end=ptr-1;
while(start < end)swap(*start++, *end--);
start = end = ptr+1;
}
}
start = src, end = ptr-2;
while(start < end)swap(*start++, *end--);
}
int main(){char src[]="I am from Shanghai.",pause;
cout << src << "\n";RevStr(src);
cout << src << "\n"; scanf("%c",&pause); return 0;}
5. 链表的翻转
6. 计算一个byte中有多少位为1
#include <iostream>
using namespace std;
int what_bit(int num)
{ int cnt=0; while(num!=0) { if(num%2 == 1)++cnt;
num /=2;
}
return cnt;}
int main(){cout << what_bit(8) << endl;
system("PAUSE"); return 0;}
7. 模式字串匹配算法
假定文本是一个长度为n的字符数组T[1..n],而模式字符串也是一个字符数组P[1..m],并且m <= n。进一步的,我们假定T所包含的所有字符构成一个有限的字符表E,|E|表示字符表所包含的自负的个数。
7.1 蛮力字符串匹配
7.2 KMP算法
最坏情况下O(m(n-m+1), 平均情况下O(n)
7.3 Rabin-Karp算法
7.4 Boyer Moore精确匹配算法(Boyer Moore Exact Pattern Matching Algorithms)
7.5 Horspool算法
最坏情况下O(nm),平均情况下O(n)。《算法设计与分析基础》P204
8. 两字符串的公共子序列
典型动态规划算法
L[i,j]表示a[0...i]和b[0...j]的公共子序列长度。
有
L[i,j] = 0, i=j=0;
L[i,j] = L[i-1, j-1]+1, a[i]=b[j];
L[i,j] = max{L[i, j-1], L[i-1, j]}, a[i]!=b[j];
有此递推式,可以用动态规划建立二维表来存储中间结果
若两字符串长度分别为m,n,则时间复杂度为O(mxn)
9. 求字符串中重复字串的最大长度
10. 找出字符串后中无重复字符的最长子串,要求O(n)复杂度
//no complete//to-do-list: 1)define the char_table function 2)analysis the efficiency#include <iostream>
using namespace std;
void char_table(char *str)
{ //...}
char *str="BCDEFDDFEJKR";
int frequency[12] = {1, 1, 3, 2, 2, 3, 3, 2, 2, 1, 1, 1};int nearest[12] = {-1, -1, -1, -1, -1, 2, 5, 4, 3, -1, -1, -1};int LSC(char *str)
{ int max_len=0; int ret_index=0;int i = 0, old_i;//substring start index
int j; while(i < strlen(str)) { j = i+1;old_i = i;
while(j < strlen(str)) {if(frequency[j] >1 && nearest[j]>=i && nearest[j]<j)//in the scope
{ //cout << j << " " << nearest[j]<< " ";i = nearest[j]+1;
//cout << "i:" << i<< " "; break;}
++j;
}
if((j-old_i) > max_len) {max_len = j-old_i;
ret_index = old_i;
}
//cout << j << " "; if(j == strlen(str)) break;}
cout << max_len << " " << ret_index;}
int main(){LSC(str);
system("PAUSE"); return 0;}
11. 有一个很长的字符串,有多个很短的字符串,要求找出长字符串中短字符串出现次数最多的子串
12. 字符串算法集
/*将浮点数转化为字符串*//* 参数说明 data:需转换的浮点数;s:输出字符串;len:转换后的长度*/void f_to_s(double data,char *s,int len)
{int dec,sign,i;char *s1,s2[100],s3[100];s1=0;
s2[0]=0;
s3[0]=0;
s1=fcvt(data,len,&dec,&sign);
if (!sign&&data>=1){MID(s2,s1,dec+1,-1);
MID(s3,s1,1,dec);
strcpy(s,"+");strcat(s,s3);
strcat(s,".");strcat(s,s2);
}
if (sign&&fabs(data)>=1){MID(s2,s1,dec+1,-1);
strcpy(s,"-");MID(s3,s1,1,dec);
strcat(s,s3);
strcat(s,".");strcat(s,s2);
}
if (!sign&&dec==0){strcpy(s,"+0.");strcat(s,s1);
}
if (sign&&dec==0){strcpy(s,"-0.");strcat(s,s1);
}
if (!sign&&dec<0){strcpy(s,"+0.");for(i=1;i<=fabs(dec);i++)strcat(s,"0");strcat(s,s1);
}
if (sign&&dec<0){strcpy(s,"-0.");for(i=1;i<=fabs(dec);i++)strcat(s,"0");strcat(s,s1);
}
if (strlen(s)>len) s[len]=0;}
/*砍掉字符串中所有空格*/void CUT_ALL_SPC(char *s)
{int i,n;char d[10000];n=0;
for(i=0;iif(s[i]!=32){d[n]=s[i];
n++;
}
d[n]=0;
strcpy(s,d);
}
/*取子字符串*/void MID(char *s,char *t,int n,int m)
{int i,j,p;if(n<1) n=1;i=strlen(s);
if(iif(m<0) m=i;else m=n+m-1;if(m>i) m=i;p=m-n+1;
if(p<0) p=0;for(i=n-1,j=0;it[j]=s[i];
t[p]=0;
}
/*字符串左靠齐*/void MOVE_LEFT(char *d,char *s,int n)
{int i,l;l=strlen(s);
if(n>l) n=l;for(i=0;i*d++=*s++;
*d=0;
}
/*取左字符串*/void LEFT(char *d,char *s,int n)
{int i,l;i=0;
l=strlen(s);
if(n>l) n=l;for(i=0;id[i]=s[i];
d[n]=0;
}
/*取右字符串*/void RIGHT(char *dest,char *source,int num)
{int i,j;if (num<1) num=0;num=strlen(source)-num;
if (num<0) num=0;for(i=0,j=num;j<=strlen(source);i++,j++) dest[i]=source[j];}
/*字符串右靠齐*/void MOVE_RIGHT(char *s,int wide)
{int i,l,n;l=strlen(s);
n=wide-l;
if (n>0){for(i=l;i>-1;i--) s[i+n]=s[i];for(i=0;i}
}
/*字符串居中*/void MOVE_MIDDLE(char *s,int wide)
{int i,l,n;l=strlen(s);
if (wide>l){wide=wide-1;
n=wide/2;
wide=wide-n;
for(i=l;i>-1;i--) s[i+n]=s[i];for(i=0;ifor(i=0;is[l+n+i]=0;
}
}
/*删除子字符串*/void Delete_SubString(char *source,int start,int num)
{int i,l;l=strlen(source);
if (num>l-start+1||num==-1) num=l-start+1;if (start<1||start>1) return;
for(i=start;isource[i-1]=source[i+num-1];
}
/*查找指定字符串*/int INSTR(int n,char *source,char *dest)
{int i,j,k1,k2,p;int start=0;if (n==0) n=1;k1=strlen(source);
k2=strlen(dest);
if (n<0){char s[100];n=-n;
MID(s,source,n,k2);
if (strcmp(s,dest)) return 0;
return n;}
if (k1-n+1for(i=n-1;i{p=0;
for(j=0;jif (source[i+j]!=dest[j]) break;
else p++;if (p==k2){start=i+1;
break;}
}
return start;}
/*产生空格*/void SPACE(char *s,int n)
{int i;if (n<0) n=0;for(i=0;i*s=0;
}
/*产生字符串*/void STRING(int n,char *s1,char *s2)
{int i;if (n<0) n=0;s1[0]=0;
for(i=1;i<=n;i++) strcat(s1,s2);}
/*砍掉字符串左边空格*/void CUT_LEFT_SPACE(char *s)
{int i,j,k=0;i=strlen(s)+1;
for(j=0;jfor(k=0;j}
/*砍掉字符串右边空格*/void CUT_RIGHT_SPACE(char *s)
{int i,j;i=strlen(s)-1;
for(j=i;j>-1;j--) if (s[j]!=' ') break;
s[j+1]=0;
}
/*插入字符串*/void INSERT_STRING(char *ds,char *ss,int n)
{char s[100];MID(ds,s,n,-1);
ds[n-1]=0;
strcat(ds,ss);
strcat(ds,s);
}
void STR_ADD_CHAR(char *s,char ch)
{char s1[2];s1[0]=ch;
s1[1]=0;
strcat(s,s1);
}
/*任意两个正整数相加(<80位)*//*参数说明:numA,numB分别为加数和被加数,result存放相加后的结果*/void add(char *numA,char *numB,char *result)
{int i,j,a,b,c,jw,Alen,Blen; /*定义变量*/
char num[81];char numC[81]; /*定义新的字串,长度与numA相同*/
char ch;char s[1];num[0]=0;
numC[0]=0;
if (strlen(numA)>=80) return;
if (strlen(numB)>=80) return;
for(i=0;iif (!isdigit(numA[i])) return; /*如果非法返回结果为空*/
for(i=0;iif (!isdigit(numB[i])) return;
if (strlen(numA){strcpy(num,numA);
strcpy(numA,numB);
strcpy(numB,num);
num[0]=0;
}
Alen=strlen(numA);
Blen=strlen(numB);
strcpy(numC,numB);
for(i=0;inumC[Alen-i-1]=numC[Blen-i-1];
for(i=0;inumC[i]='0';jw=0; /*进位*/for(i=0;i{s[0]=numA[Alen-i-1];
s[1]=0;
a=atoi(s);
s[0]=numC[Alen-i-1];
s[1]=0;
b=atoi(s);
c=a+b+jw;
if (c>=10){jw=1;
c=c-10;
}
else jw=0;itoa(c,s,10);
num[i]=s[0];
}
if (jw==1) {num[i]='1';num[i+1]=0;}
else num[i]=0;j=strlen(num);
for(i=0;i{ch=num[i];
num[i]=num[j-i-1]; /*将num反转*/num[j-i-1]=ch;
}
strcpy(result,num);
return; /*返回相加结果*/
}
/*任意两个正整数相乘*//*参数说明:numA,numB 分别为乘数和被乘数,resultm存放积*/void mult(char *numA,char *numB,char *resultm)
{int i,j,k,l,m,a,b,c,jw,Alen,Blen,f; /*定义变量*/
char resulta[82];char num[161];char ch;char s[1];num[0]=0;
f=0;
if (strlen(numA)>=80) return;
if (strlen(numB)>=80) return;
for(i=0;iif (!isdigit(numA[i])) return; /*如果非法返回结果为空*/
for(i=0;iif (!isdigit(numB[i])) return;
if (strlen(numA){strcpy(num,numA);
strcpy(numA,numB);
strcpy(numB,num);
num[0]=0;
}
Alen=strlen(numA);
Blen=strlen(numB);
strcpy(resultm,"0");for(i=0;i{s[0]=numB[Blen-i-1];
s[1]=0;
c=atoi(s);
strcpy(resulta,numA);
if (c==0) strcpy(resulta,"0");
for(j=0;jl=strlen(resulta);
for(k=0;k{resulta[l+k]='0';resulta[l+k+1]=0;
}
add(resultm,resulta,resultm);
}
}
浙公网安备 33010602011771号