面试-字符串操作

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)复杂度

lcs

//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;i
if(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(i
if(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;i
t[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;i
d[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;i
for(i=0;i
s[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;i
source[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+1
for(i=n-1;i
{
p=0;
for(j=0;j
if (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;j
for(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;i
if (!isdigit(numA[i])) return; /*如果非法返回结果为空*/
for(i=0;i
if (!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;i
numC[Alen-i-1]=numC[Blen-i-1];
for(i=0;i
numC[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;i
if (!isdigit(numA[i])) return; /*如果非法返回结果为空*/
for(i=0;i
if (!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;j
l=strlen(resulta);
for(k=0;k
{
resulta[l+k]='0';
resulta[l+k+1]=0;
}
add(resultm,resulta,resultm);
}
}
posted @ 2007-11-07 10:52  中土  阅读(2738)  评论(0编辑  收藏  举报
©2005-2008 Suprasoft Inc., All right reserved.