字符串反转
题目:将字符串” I am a student”转换为”student a am I”;
代码如下:
#include<iostream>
#include<string>
using namespace std;
void ReverString(char* str, int from, int to);
void Prin(char* str); //输出字符串
int main()
{
char str[]= "i am a student";
cout << strlen(str) << endl;
Prin(str);
ReverString(str, 0, strlen(str)-1);
Prin(str);
int m =0;
for (int i = 0; i < strlen(str)-1; i++)
{
if (str[i] ==' ')
{
ReverString(str, m, i-1);
//标记开始位置
m = i + 1;
}
}
Prin(str);
system("pause");
return 0;
}
//该函数可以用于字符串的反转
void ReverString(char* str, int from, int to)
{
if (from >=to)
{
return;
}
while (from < to)
{
char temp = str[from];
str[from++] =str[to];
str[to--] = temp;
}
}
void Prin(char* str)
{
for (int i = 0; i <strlen(str); i++)
{
cout << str[i];
}
cout << endl;
}
思路分析:首先将字符串整体反转,然后再根据空格进行反转。
字符串的包含
题目:判断字符串的相互包含情况:
#include<iostream>
#include<string>
using namespace std;
bool StringContain(string& a,string& b);
int main()
{
string str1= "UNIVERSITY";
string str2 = "UNIVERSE";
if (StringContain(str1, str2))
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
system("pause");
return 0;
}
/*利用位运算进行判断字符串的包含*/
bool StringContain(string& a, string& b)
{
int hash = 0;
for (int i = 0; i < a.length(); ++i)
{
// 注意此处"|"为按位或,"<<"为左移
hash |= (1 << (a[i] - 'A'));
}
for (int j = 0; j < b.length(); ++j)
{
//“&"为按位与
if ((hash&(1 << (b[j] - 'A'))) == 0)
{
return false;
}
}
return true;
}
所以思路就是通过为较长的字符串编码,然后与较短的字符串比较。
这里复习一下位运算:
(1)& 按位与,如果两个相应的二进制位都是1,结果就为1,否则为0.
用途:清零;取指定位;包;保留指定位;
(2)| 按位或,两个参与运算的二进制中只要有一个为1,结果就为1.
(3)^ 按位异或,两个参加运算的二进制相同结果就为0,否则为1.
用途:保持特定位翻转。
(4)~ 取反,为一元运算符。
(5)<<左移,用来将一个数的二进制位全部左移N位,右补0
(6)>>右移,将一个数的二进制位全部右移N位,移到右边的被丢弃,对于无符号数,最高位补0.