愿我们,
都能成为可爱又有趣的大人呀~
目录
>>1.每日总结
- 当一个类对象的生命周期结束后,关于调用析构函数:先调用派生类的析构函数,后调用基类的析构函数。
- 关于一个类的静态成员描述:该类的静态成员变量得值不可修改。
- 关于C++:任何引用都必须指向一个实例。
- 关于虚函数:内联函数 inline ,不能是虚函数。 虚函数不可以是一个static型的函数。
-
C++的inline关键字: 定义在Class声明内的成员函数默认是 inline 函数。类定义中包含数据成员和函数成员的声明。
>>2.排列子序列
牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一
个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数
组分为几段排序子序列.
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出
2
输入描述:
输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)
第二行包括n个整数A_i(1 ≤ A_i ≤ 10^9),表示数组A的每个数字。
输出描述:
输出一个整数表示牛牛可以将A最少划分为多少段排序子序列
示例1:
输入
6
1 2 3 2 2 1
输出
2
【题目解析】:
本题要求解的是排序子序列,排列子序列为非递增或者非递减。注意:非递减就是a[i]<=a[i+1],递减就是a[i]>a[i+1],递减就是a[i]<a[i+1].
【解题思路】:
1. 本题依次比较整个数组
2. a[i+1]>a[i] ,则进入非递增序列判断,直到遍历到下一个值不大于等于为止count++,然后进行下一位
置的判断
3. a[i+1]<a[i],则进入非递增序列判断,直到遍历到下一个值不小于等于为止count++,然后进行下一位
置的判断
4. a[i+1] == a[i]不进行操作,++i进行下一位置遍历,因为相等既可以属于非递增序列,也可以属于非递减
序列。
本题注意点:本题开始比较a[i+1]与a[i]进行比较,为了避免越界,数组定义为n+1个,同时给a[n]=0;a[n]=0带来的影响。
代码实现:
//排列子序列
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
cin >> n;
//这里注意多给了一个值,是处理越界的情况的比较,具体参考上面
vector<int> a;
a.resize(n + 1);
a[n] = 0;
//读入数组
int i = 0;
for (i = 0; i < n; ++i)
cin >> a[i];
i = 0;
int count = 0;
while (i < n) {
// 非递减子序列
if (a[i] < a[i + 1]) {
while (i < n && a[i] <= a[i + 1])
i++;
count++;
i++;
}
else if (a[i] == a[i + 1]) {
i++;
}
else // 非递增子序列
{
while (i < n && a[i] >= a[i + 1])
i++;
count++;
i++;
}
}
cout << count << endl;
system("pause");
return 0;
}
>>字符串的倒置
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割
示例1:
输入
I like beijing.
输出
beijing. like I
解题思路1:
【解题分析】
本题将一段字符串中的前后单词交换,移单词为单位逆置。
先将整个字符串逆置过来,在遍历字符串,找出每个单词,对单词逆置,这里我们使用了stl算法中的reverse,所以这里使用迭代器遍历string。
代码实现:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s;
// 注意这里要使用getline,cin>>s遇到空格就接收结束了
getline(cin, s);
// 翻转整个句子
reverse(s.begin(), s.end());
// 翻转单词
auto start = s.begin();
while (start != s.end()) {
auto end = start;
while (end != s.end() && *end != ' ')
end++;
reverse(start, end);
if (end != s.end())
start = end + 1;
else
start = end;
}
cout << s << endl;
system("pause");
return 0;
}
解题思路2:
【解题分析】
这是一个比较讨巧的思路,直接利用cin>>s接受输入,遇到空格就结束了,自然就分割开了每个单词,
其次将每次接收到的单词拼接到之前串的前面就可以逆置过来了
代码实现:
#include <iostream>
#include <string>
using namespace std;
// cin读取string时自动会被空格分隔开,用另一个字符串存储进行逆序输出
int main() {
string s1, s2;
cin >> s2;
while (cin >> s1) s2 = s1 + " " + s2;
cout << s2 << endl;
system("pause");
return 0;
}
~bye~