C语言常见字符串小算法内容

转载 2016年06月01日 23:36:20

http://blog.csdn.net/hkh5730/article/details/14674183

写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)
功能:
在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int continumax(char *outputstr, char *inputstr)  
  2. {  
  3.     char *in = inputstr, *out = outputstr, *temp, *final;  
  4.     int count = 0, maxlen = 0;  
  5.     while( *in != '/0' )  
  6.     {  
  7.         if( *in > 47 && *in < 58 )  
  8.         {  
  9.             for(temp = in; *in > 47 && *in < 58 ; in++ )  
  10.             count++;  
  11.         }  
  12.     else  
  13.     in++;  
  14.     if( maxlen < count )  
  15.     {  
  16.         maxlen = count;  
  17.         count = 0;  
  18.         final = temp;  
  19.     }  
  20.     }  
  21.     for(int i = 0; i < maxlen; i++)  
  22.     {  
  23.         *out = *final;  
  24.         out++;  
  25.         final++;  
  26.     }  
  27.     *out = '/0';  
  28.     return maxlen;  
  29. }  

11) 编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. char * search(char *cpSource, char ch)  
  2. {  
  3.          char *cpTemp=NULL, *cpDest=NULL;  
  4.          int iTemp, iCount=0;  
  5.          while(*cpSource)  
  6.          {  
  7.                  if(*cpSource == ch)  
  8.                  {  
  9.                           iTemp = 0;  
  10.                           cpTemp = cpSource;  
  11.                           while(*cpSource == ch)   
  12.                                    ++iTemp, ++cpSource;  
  13.                           if(iTemp > iCount)   
  14.                                 iCount = iTemp, cpDest = cpTemp;  
  15.                         if(!*cpSource)   
  16.                             break;  
  17.                  }  
  18.                  ++cpSource;  
  19.      }  
  20.      return cpDest;  
  21. }        
排序算法:

冒泡排序: 出现次数相当频繁

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. void buble(int *a,int n)  
  2. {  
  3.     for(int i=0;i<n;i++)  
  4.     {  
  5.         for(int j=1;j<n-i;j++)  
  6.         {  
  7.             if(a[j]<a[j-1])  
  8.             {  
  9.                 int temp=a[j];  
  10.                 a[j] = a[j-1];  
  11.                 a[j-1] = temp;  
  12.             }  
  13.         }  
  14.     }  
  15. }  

插入排序:
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. void insertsort(int* a,int n)  
  2. {  
  3.     int key;  
  4.     for(int j=1;j<n;j++)  
  5.     {  
  6.         key = a[j];  
  7.         for(int i=j-1;i>=0&&a[i]>key;i--)  
  8.         {  
  9.             a[i+1] = a[i];  
  10.         }  
  11.         a[i+1] = key;  
  12.     }  
  13. }  

将一个数字字符串转换为数字."1234" -->1234

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int atoii(char* s)  
  2. {  
  3.     assert(s!=NULL);  
  4.     int num = 0;  
  5.     int temp;  
  6.     while(*s>'0' && *s<'9')  
  7.     {  
  8.         num *= 10;  
  9.         num += *s-'0';  
  10.         s++;  
  11.     }  
  12.     return num;  
  13. }  
http://yuanlanxiaup.iteye.com/blog/1327258
摘录于下, 来源:http://rjwyr.blog.163.com/blog/static/112986400201153061911864/

字符串操作

#include <iostream>
#include <sstream>
#include <limits>
#include <vector>
#include <string>
using namespace std;
/*\
1.翻转句子中的单词
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。
*/
void reverseWord()
{
vector<string> vec;
/* string str,word;
getline(cin,str);
istringstream in_str(str);
while(in_str>>word)
vec.push_back(word);
*/
string word;
while(cin>>word)
vec.push_back(word);
vector<string>::reverse_iterator it;
for(it=vec.rbegin();it!=vec.rend();it++)
cout<<*it<<" ";
cout<<endl;
}
/*
2.第一个只出现一次的字符
例如abcaccd 输出b
解题思路:利用hash思想,字符一共256个,则建立一个大小为256的数字
*/
int getFirstNoRepeatCh()
{
char str[256];
int s[256],i;
cout<<"please input the word:";
cin>>str;
for(i=0;i<256;i++)
s[i]=0;
for(i=0;str[i]!='\0';i++)
s[str[i]]++;
for(i=0;str[i]!='\0';i++)
{
if(s[str[i]]==1)
{
cout<<str[i]<<endl;
return i;
}
}
return 0;
}
/*
3把字符串转化为数字
题目不难,但是考察编程习惯,比如判断正负号,是否为数字字符,是否越界等
函数返回值指示是否正确转化,sum代表转化后的值
*/
bool converseToNumber(const char *pStr, int &sum)
{
const char *pChar=pStr;
int flag=1;
bool isValid=true;
__int64 s=0;
if(pStr==NULL)
return false;
if(*pChar=='-')
{
flag=-1;
pChar++;
}
else
{
if(*pChar=='+')
pChar++;
}
while(*pChar != '\0')
{
if( *pChar <='9' && *pChar>='0')
{
s=10*s+ (*pChar -'0');
//overflow
if(s > std::numeric_limits <int>::max())
{
isValid=false;
s=0;
break;
}
}
//the char is not a digit,input error
else
{
isValid=false;
s=0;
break;
}
}
if(*pChar == '\0')
{
if(flag<0)
s=0-s;
sum=static_cast<int>(s);
}
return isValid;
}
/*
4.左旋字符串
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
*/
/*
思路1,将字符串看成两部分XY,目标是YX,我们利用将X Y 分别翻转来得到结果 (XT YT)T=YX.
*/
//reverse the word
void reverse(char *pStart,char *pEnd)
{
char ch;
if(pStart!=NULL && pEnd!=NULL)
{
while(pStart<pEnd)
{
ch=*pStart;
*pStart=*pEnd;
*pEnd=ch;
pStart++;
pEnd--;
}

}
}
char * leftConverseStr(char *pStr,int m)
{
if(pStr!=NULL)
{
int len=static_cast<int>(strlen(pStr));
if(len>0 && m<len && m>0)
{
char *pFirstS=pStr;
char *pFirstE=pStr+m-1;
char *pSecondS=pStr+m;
char *pSecondE=pStr+len-1;
reverse(pFirstS,pFirstE);
reverse(pSecondS,pSecondE);
reverse(pFirstS,pSecondE);
}
}
return pStr;
}
/*
5.在字符串中删除特定的字符.输入They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。
遍历源字符串,对每个字符在第二个字符串中查找是否存在,存在则删除。首先我们对第一部分进行优化,由于删除一个字符时,后面的都要
往前移,这样删除一个字符需要O(n),太耗时了,一个改进的做法是维护两个指针 pFast pSlow,当当前字符是需要删除的字符时,pFast ++
,是不需要删除的字符时,两个都++,这样我们最后得到了pslow就是结果,对于查找部分,利用hash,时间复杂度O(1).
*/
char * delChar(char *pSource,char *pDel)
{
char hashT[256];
memset(hashT,0,sizeof(hashT));
char *pChar=pDel;
while(*pChar!='\0')
{
hashT[*pChar]=1;
pChar++;
}
char *pFast=pSource,*pSlow=pSource;
while(*pFast != '\0')
{
if(hashT[*pFast] != 1)
{
*pSlow=*pFast;
pSlow++;
}
pFast++;
}
*pSlow='\0';
return pSource;
}
/*
6.对称子字符串的最大长度
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。
比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。
解题思路:判断一个字符串是否对称相信都会做,从两边向中间开始逐一判断,如果采用这个思路,我们需要枚举出所有可能的子串
即n^2个,然后对每一个子串判断是否对称,这样时间复杂度O(n^3).因为存在重复判断,所以时间负责度会这么高,我们换一种思路
从中间像两端判断,这样可以降低复杂度,为O(n^2)
*/
int getLongestSymmetricalLength(char *pStr)
{
int len=0;
if(pStr!=NULL)
{
int tmp=0;
len=1;
char *pChar=pStr;
while(*pChar != '\0')
{
//odd length
char *pLeft=pChar-1;
char *pRight=pChar+1;
while(pLeft >= pStr && *pRight!= '\0' && (*pLeft==*pRight))
{
pLeft--;
pRight++;
}
tmp=pRight-pLeft-1;
if(tmp>len)
len=tmp;
pLeft=pChar;
pRight=pChar+1;
while(pLeft >=pStr && *pRight!='\0' && (*pLeft==*pRight))
{
pLeft--;
pRight++;
}
//even length
tmp=pRight-pLeft-1;
if(tmp>len)
len=tmp;
pChar++;
}
}
return len;

}
int main()
{
// reverseWord();
// getFirstNoRepeatCh();
/*
cout<<"please input the converseStr :";
char str[100];
int sum=0;
cin>>str;
if(converseToNumber(str,sum))
cout<<sum<<endl;
else
cout<<"invalid input,converse error"<<endl;
*/
/*
cout<<"please input the leftConverseStr :";
char str[100];
int m=5;
cin>>str;
char * re=leftConverseStr(str,3);
cout<<re<<endl;
*/
/* cout<<"please input the source and del string :";
char source[100],del[100];
// cin>>source>>del;
cin.getline(source,100,'\n');
cin.getline(del,100,'\n');
char *re=delChar(source,del);
cout<<re<<endl;
*/
char str[100];
cout<<"please input the string :";
cin>>str;
int re=getLongestSymmetricalLength(str);
cout<<re<<endl;
return 0;
}

第25 题:写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)

第25 题:写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长...

微软面试100题之25题:写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)

写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) 功能: 在字符串中找出连续最长的数字串,并把这个串的长度返回, 并把这个最长...

Lacking counting POJ.NO 2386

/*有一个大小为N*M的园子,雨后积了水 八连通的水被认为是联通在一起的 请 求出院子里总共有多少水洼? #代表有水 .代表无水 EG: 输入某年和第几天,得到年月日,输入年月日得到天数的小程序...

埃氏筛法-素数个数>大数

首先埃氏筛法 /*求[2,?]区间内素数的个数*/ # include int ZHI(char *A,int max); # define N 10000 //本题目N取10000就行 不过为...

常见的字符串匹配算法对比实现C语言版本

/*文件命名:match.c */ #include #include #include #include #include #define ASCII_SIZE       ...

C语言字符串常见操作

// 1. 字符串的拷贝 char *myStrcpy(char *dst,char *src) { char *ret = dst; if(dst == NULL || src ==...

C语言标准库中常见字符串处理函数

void *memccpy (void *dest, const void *src, int c, size_t n); 从src所指向的对象复制n个字符到dest所指向的对象中。如果复制过程中遇...

C语言常见字符串函数实现

/* 熟练使用C语言中提供的代码库有助于我们在编程时极大减少工作量和一些没有必要的bug。 想成为一个优秀的程序员,必须深入理解这些库。而编写这些库就是最好的学习手段。 在平常的积累中,也可以自己扩展...

常见C语言字符串函数

      额,据说,在面试的时候经常会出现要我们实现字符串函数的题目,话还说这些题目其实很简单,主要考的是面试者的代码风格和考虑问题的严谨性。偶要是没看到有些面试题目考这些字符串函数,偶估计就不会用...

C语言中常见的字符串处理函数

C语言中常见的字符串处理函数C语言中提供了大量丰富的字符串处理函数,大致可以分为字符串的输入,输出,合并,修改,比较,转换,复制,搜索几类。 用于输入输出的函数包含在stdio.h中而其他的字符串处...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言常见字符串小算法内容
举报原因:
原因补充:

(最多只允许输入30个字)