首先是一个在一本书(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++语法知识的复习,以及实现目的过程中较难的思想的复习,本次就先写到这里!