1.反轉(zhuǎn)字符串
#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.字符串轉(zhuǎn)數(shù)字
#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;
//處理正負(fù)
int sign = 1;
if (*str == '+' || *str == '-')
{
if (*str == '-')
sign = -1;
++str;
}
//確定是數(shù)字后才執(zhí)行循環(huán)
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;
}
//把之前得到的數(shù)字乘以10,再加上當(dāng)前字符表示的數(shù)字夜矗。
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.判斷是否為回文
判斷一條單向鏈表是不是“回文”
分析:對(duì)于單鏈表結(jié)構(gòu)点骑,可以用兩個(gè)指針從兩端或者中間遍歷并判斷對(duì)應(yīng)字符是否相等酣难。但這里的關(guān)鍵就是如何朝兩個(gè)方向遍歷谍夭。由于單鏈表是單向的,所以要向兩個(gè)方向遍歷的話憨募,可以采取經(jīng)典的快慢指針的方法紧索,即先位到鏈表的中間位置,再將鏈表的后半逆置菜谣,最后用兩個(gè)指針同時(shí)從鏈表頭部和中間開始同時(shí)遍歷并比較即可珠漂。
判斷一個(gè)棧是不是“回文”
分析:對(duì)于棧的話,只需要將字符串全部壓入棧尾膊,然后依次將各字符出棧媳危,這樣得到的就是原字符串的逆置串,分別和原字符串各個(gè)字符比較冈敛,就可以判斷了待笑。
#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.字符串轉(zhuǎn)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;//符號(hào)
++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;
}