1.反转字符串
#include <iostream>
#include <string>
using namespace std;
void ReverseString(string &x,int begin,int end)
{
while(begin<end)
{
char t=x[begin];
x[begin++]=x[end];
x[end--]=t;
}
}
void RotateString(string &s,int n, int m)
{
m%=n;
ReverseString(s,0,m-1);
ReverseString(s,m,n-1);
ReverseString(s,0,n-1);
}
int main()
{
string s("Ilovebaofeng");
int m = 7;
RotateString(s,s.length(),s.length()-m);
cout<<s<<endl;
return 0;
}
2.字符串包含问题
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool StringContain1(string &a, string &b)
{
for(int i=0;i<b.length();++i)
{
for(int j=0;(j<a.length()) && (a[j]!=b[i]);++j) {}
if(j==a.length()) return false;
}
return true;
}
bool StringContain2(string &a,string &b)
{
sort(a.begin(),a.end());
sort(b.begin(),b.end());
for(int i=0;i<b.length();++i)
{
int j=0;
while((j<a.length()) && (a[j]<b[i])) {++j;}
if((j==a.length()) || (a[j]>b[i])) return false;
}
return true;
}
bool StringContain3(string &a,string &b)
{
const int p[26] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
43, 47, 53, 59,61, 67, 71, 73, 79, 83, 89, 97, 101};
int f = 1;
for (int i=0;i<a.length();++i)
{
int x = p[a[i] - 'A'];
if (f % x)
{
f *= x;
}
}
for (i=0;i<b.length();++i)
{
int x = p[b[i] - 'A'];
if (f % x)
{
return false;
}
}
return true;
}
bool StringContain4(string &a,string &b)
{
int hash = 0;
for (int i = 0; i < a.length(); ++i)
{
hash |= (1 << (a[i] - 'A'));
}
for ( i = 0; i < b.length(); ++i)
{
if ((hash & (1 << (b[i] - 'A'))) == 0)
{
return false;
}
}
return true;
}
int main()
{
string a("ABCD");
string b("BC");
if(StringContain4(a,b))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
return 0;
}
3.字符串转数字
#include <iostream>
//#include <string>
using namespace std;
int StrToInt(const char* str)
{
static const int MAX_INT = (int)((unsigned)~0 >> 1);
static const int MIN_INT = -(int)((unsigned)~0 >> 1) - 1;
unsigned int n = 0;
//判断是否输入为空
if (str == 0)
{
return 0;
}
//处理空格
while (isspace(*str))
++str;
//处理正负
int sign = 1;
if (*str == '+' || *str == '-')
{
if (*str == '-')
sign = -1;
++str;
}
//确定是数字后才执行循环
while (isdigit(*str))
{
//处理溢出
int c = *str - '0';
if (sign > 0 && (n > MAX_INT / 10 || (n == MAX_INT / 10 && c > MAX_INT % 10)))
{
n = MAX_INT;
break;
}
else if (sign < 0 && (n >(unsigned)MIN_INT / 10 || (n == (unsigned)MIN_INT / 10 && c > (unsigned)MIN_INT % 10)))
{
n = MIN_INT;
break;
}
//把之前得到的数字乘以10,再加上当前字符表示的数字。
n = n * 10 + c;
++str;
}
return sign > 0 ? n : -n;
}
int main()
{
int x=0;
char a[11]="2147483646";
x=StrToInt(a);
cout<<x<<endl;
return 0;
}
4.判断是否为回文
判断一条单向链表是不是“回文”
分析:对于单链表结构,可以用两个指针从两端或者中间遍历并判断对应字符是否相等。但这里的关键就是如何朝两个方向遍历。由于单链表是单向的,所以要向两个方向遍历的话,可以采取经典的快慢指针的方法,即先位到链表的中间位置,再将链表的后半逆置,最后用两个指针同时从链表头部和中间开始同时遍历并比较即可。
判断一个栈是不是“回文”
分析:对于栈的话,只需要将字符串全部压入栈,然后依次将各字符出栈,这样得到的就是原字符串的逆置串,分别和原字符串各个字符比较,就可以判断了。
#include <iostream>
#include <string>
using namespace std;
bool is_palindrome(string s)
{
if(s.length()<1)
return false;
int front=0,end=s.length()-1;
while(front<end)
{
if(s[front++]!=s[end--])
return false;
}
return true;
}
int main()
{
string s("ABCBA");
if(is_palindrome(s))
cout<<s<<endl;
else
cout<<"no palindrome"<<endl;
return 0;
}
5.最长回文子串
#include <iostream>
#include <string>
using namespace std;
int LongestPalindrome(string s)
{
int i,j,max=0;
if(s.length()<1)
return 0;
for(i=0;i<s.length();++i)
{
for(j=0;(i-j>0)&&(i+j<s.length());++j)//odd
if(s[i-j]!=s[i+j]) break;
if(2*j+1>max) max=2*j+1;
for(j=0;(i-j>0)&&(i+1+j<s.length());++j)//even
if(s[i-j]!=s[i+1+j]) break;
if(2*j+2>max) max=2*j+2;
}
return max;
}
int main()
{
string s("ABCBADE");
cout<<LongestPalindrome(s)<<endl;
return 0;
}
6.字符串的全排列
7.字符串转float
#include <ctype.h>
#include <math.h>
#include <iostream>
using namespace std;
double mystrtofloat(char *ch)
{
if(!ch) return 0;
while(isspace(*ch)) ++ch;//空格
int sign=1;
if(*ch=='+'||*ch=='-')
{
sign='+'? 1: -1;//符号
++ch;
}
double num1=0.0,num2=0.0,num;
double cnt=1.0;
bool got_dot=false;
while(*ch!='\0')
{
if(isdigit(*ch)&&!got_dot)
num1=num1*10+(*ch-'0');
else if(*ch == '.')
got_dot=true;
else if(isdigit(*ch) && got_dot)
{
cnt=0.1*cnt;
num2=num2 +cnt*(*ch-'0');
}
else
break;
++ch;
}
num=sign*(num1+num2);
int expnt=0;
if(*ch=='e')
{
sign=1;
++ch;
while(*ch!='\0')
{
if(*ch=='+' || *ch=='-')
{
sign = '+'?1:-1;
ch++;
}
if(isdigit(*ch))
expnt=expnt*10+(*ch-'0');
++ch;
}
num=num*pow(10,expnt);
}
return num;
}
int main()
{
// char ch[]="123.456";
char ch[]="12.2e3";
double x=mystrtofloat(ch);
cout<<x<<endl;
return 0;
}