2021年1月14日-2021年1月15日学习笔记

        首先是一个在一本书(C陷阱与缺陷)上看到的一个小的知识点。词法分析法中的贪心法:当C语言读入了连续两个等号,是将其作为一个符号对待还是作为两个符号对待,答案显而易见,C语言中一定是合起来作为一个符号对待的。

C语言对这个问题的解决方案可以归纳为一个很简单的规则:每一个符号应尽包含尽可能多的字符,即,当读入一个可能有组合的符号时,它会继续读入,直到已不可能组成一个有意义的符号,也被称为”大嘴法“。

        接下来就是一些C++中我认为较难的语法题的一个复习:

1.菱形:
        

这个题当然很常见了,但见识到了一种很新颖的写法,故写出来。

这个题使用的是距离矩阵中心点的曼哈顿距离来解决,首先给出曼哈顿距离的公式:

例如在平面上,坐标(x1,y1)的i点与坐标(x2,y2)的j点的曼哈顿距离为:

d(i,j)=|X1-X2|+|Y1-Y2|.

我们只需要在距离中心点曼哈顿距离小于等于n/2(n为矩阵边长)打印‘ * ’,其他地方打印空格即可,代码如下。

#include<iostream>

using namespace std;

int main(){
    int n;
    cin>>n;
    int cx = n / 2,cy = n / 2;//定位中心点的坐标。
    for(int i = 0;i < n;i++){
        for(int j = 0;j < n;j++){
            //利用曼哈顿距离进行判断。
            if(abs(i - cx)+abs(j - cy) <= n / 2) cout<<'*';
            else cout<<' ';
        }
        cout<<endl;
    }
    
    return 0;
}

2.单词替换:

 这个题主要是利用C++的强大的语法来解决的。

主要是采用stringstream来将一句话拆成一个一个单词,再利用C++中的string可以直接比较大小来实现,代码如下:

#include<iostream>
#include<sstream>//stringstream在此头文件下。

using namespace std;

int main(){
    string s,a,b;
    getline(cin,s);//读入包含空格的字符串
    cin>>a>>b;
    stringstream ssin(s);
    string str;
    while(ssin>>str){
        if(str == a) cout<<b<<' ';//如果出现了要替换的字符串,则输出
        //替换后的字符串。
        else cout<<str<<' ';
    }
    
    return 0;
}

3.最长单词:

 这个题我们需要注意的点是要去掉字符串结尾的“.”。方法与上题类似。

#include<iostream>
#include<sstream>

using namespace std;

int main(){
    string s;
    getline(cin,s);
    s.pop_back();//去掉最后一个字符。
    stringstream ssin(s);
    string str,str1;
    while(ssin>>str){
        if(str.size()>str1.size()) str1 = str;
    }
    
    cout<<str1<<endl;
    
    return 0;
}

4.倒排单词

 同样可以用上题思路,直接上代码:    

#include<iostream>
#include<sstream>

using namespace std;

int main(){
    string s;
    getline(cin,s);
    stringstream ssin(s);
    string str,str1;
    while(ssin>>str) str1 = str + ' ' + str1 ;
    cout<<str1<<endl;
    
    return 0;
}

5.字符串移位包含问题:

我的方法是直接暴力解决,如果后一个字符串比第一个字符串长,直接交换。移位字符串长度 - 1次,以样例来说,第一次(移位)是ABCDA,第二次BCDAA,第三次CDAAB,4:DAABC5:AABCD。所以我们需要循环字符串长度-1次就能枚举出所有情况,然后判断前四个字符是否相等即可,如果相等就可以直接退出了,代码如下:

#include<iostream>

using namespace std;

int main(){ 
    string s1,s2;
    cin>>s1>>s2;
    if(s1.size()<s2.size()) swap(s1,s2);
    for(int i = 0;i < s1.size();i++){
        s1 = s1.substr(1) + s1[0];
        if(s1.substr(0,s2.size()) == s2){
            puts("true");
            
            return 0;
        }
    }
    puts("false");
    
    return 0;
}

            这些主要是对于前一段时间学习的C++语法知识的复习,以及实现目的过程中较难的思想的复习,本次就先写到这里!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值