字符串(1)

字符串反转

题目:将字符串” 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值