南京三星面试准备1--字符串

来源:互联网 发布:路由器如何连接网络 编辑:程序博客网 时间:2024/05/01 06:26

字符串

1、把一串字符串里的数字找出来加起来

long long int AddNumInChar(const char* str){assert(str!=NULL);int length=strlen(str);long long int result=0;for(int i=0;i<length;i++){if(str[i]>='0'&&str[i]<='9'){result+=str[i]-'0';}}return result;}

2、把字符串转换成整数

void Char2Int(const char*str){assert(str!=NULL);int length=strlen(str);long long int result=0;bool flag=false;bool fuhao=true;for(int i=0;i<length;i++){if(i==0&&(str[0]=='+'||str[0]=='-')){fuhao=str[0]=='-'?false:true;}else if(str[i]>='0'&&str[i]<='9'){flag=true;result=result*10+str[i]-'0';}else{printf("My God\n"); return;}}if(!fuhao)result=result*(-1);printf("%lld\n",result);}


3、把字符串顺序倒过来


char* reverseString(char* str){assert(str!=NULL);int length=strlen(str);for(int i=0;i<length/2;i++){char temp=str[i];str[i]=str[length-i-1];str[length-i-1]=temp;}return str;}

4、找字符串里的回数
char *FindString(const char *str){assert(str!=NULL);int length=strlen(str);int *numbers=new int[length];float *index=new float[length];numbers[0]=numbers[length-1]=1;index[0]=0;index[length-1]=length-1;int left,right;for(int i=1;i<length-1;i++){left=i-1;right=i+1;if(str[left]!=str[right]&&str[left]!=str[i]&&str[i]!=str[right]){numbers[i]=1;index[i]=i;}else {if(str[left]==str[right]){numbers[i]=3;index[i]=i;}else if(str[left]==str[i]){numbers[i]=2;index[i]=(left+i)/2.0;right=i;}else if(str[i]==str[right]){numbers[i]=2;index[i]=(right+i)/2.0;left=i;}while(--left>=0&&++right<length){if(str[left]==str[right])numbers[i]+=2;elsebreak;}}}int max=numbers[0];int tempI=0;for(int i=0;i<length;i++){if(numbers[i]>max){tempI=i;max=numbers[i];}}char *result=new char[max];for(int i=0;i<max;i++){int temp=floor(i+index[tempI]-max/2+0.5);result[i]=str[temp];}delete []numbers;return result;}

5、替换空格为%20:

char* ChangeString(char* myChar,int length){    char* result=new char[length*3];     int count=0;    for(int i=0;i<length;i++)    {        if(myChar[i]==' ')        {            result[count++]='%';            result[count++]='2';            result[count++]='0';        }        else        {            result[count++]=myChar[i];        }    }    result[count]='\0';    return result;}

6、翻转单词顺序

void Reverse(char* const numbers,int length){char temp;for(int i=0;i<length/2;i++){temp=numbers[i];numbers[i]=numbers[length-i-1];numbers[length-i-1]=temp;}}void PrintReverse(char* const numbers,int length){int i=0;Reverse( numbers,length);int letterLen=0,begin=0;i=0;bool flag=true;while(numbers[i]!='\0'){if(numbers[i]!=' '){flag=true;letterLen++;}else if(flag){if(letterLen>1)Reverse(numbers+begin,letterLen);letterLen=0;begin=i+1;flag=false;}elsebegin++;i++;}Reverse(numbers+begin,letterLen);printf("%s\n",numbers);}
左旋转字符串
void Reverse(char* const numbers,int length)
{
char temp;
for(int i=0;i<length/2;i++)
{
temp=numbers[i];
numbers[i]=numbers[length-i-1];
numbers[length-i-1]=temp;
}
}
void PrintMov(char* const numbers,int move)
{
int length=strlen(numbers);
move=move%length;


Reverse( numbers,length);


Reverse(numbers,length-move);
Reverse(numbers+length-move,move);
printf("%s\n",numbers);
}

7、第一次只出现一次的字符

int FirstOneCharacter(const char* characters){int appearances[LetterNum]={0};int result=-1;if(characters==NULL)return result;int length=strlen(characters);for(int i=0;i<length;i++){appearances[characters[i]-'A']++;}for(int i=0;i<length;i++){if(appearances[characters[i]-'A']==1){result=i;break;}}return result;}


8、字符串的全排列:

void Permutation(char* source,char *begin);void Permutation(char* source){int length=strlen(source);if(source==NULL||length<=0)return;Permutation(source,source);}int *Sort(char *arrays){int length=strlen(arrays);char temp;int *index=new int[length];int tempIndex;for(int i=0;i<length;i++){index[i]=i;}for(int i=0;i<length;i++){for(int j=i;j<length;j++){if(arrays[j]<arrays[i]){temp=arrays[j];arrays[j]=arrays[i];arrays[i]=temp;tempIndex=index[j];index[j]=index[i];index[i]=tempIndex;}}}return index;}void Permutation(char* source,char *begin){if(begin[0]=='\0')printf("%s\n",source);else{int length=strlen(begin);char *temp=new char[length+1];int i=0;char word;int *index;temp=strcpy(temp,begin);index=Sort(temp);for(;i<length;i++){if(i>0&&temp[i]==temp[i-1])continue;swap(begin[0],begin[index[i]]);Permutation(source,begin+1);swap(begin[0],begin[index[i]]);}delete []temp;delete []index;}}

9.又见字符串的问题
1.给出一个函数来复制两个字符串A和B。
字符串A的后几个字节和字符串B的前几个字节重叠。
分析:记住,这种题目往往就是考你对边界的考虑情况。
2.已知一个字符串,比如asderwsde,寻找其中的一个子字符串比如sde的个数,

如果没有返回0,有的话返回子字符串的个数。

3.编写strcpy函数,不可以用字符串相关的库函数。


原创粉丝点击