一、剔除数字字符
将字符串 S 中所有的数字字符去掉,保留其余字符,并且将形成的新字符串存储在原 S 的空间中。
输入格式
输入一行,表示一个字符串。注意字符串中可能包含空格。
输出格式
输出一行,表示剔除数字字符之后的字符串
数据范围
$1≤字符串长度≤1000$
输入样例
123abc4 5d 67 ef
输出样例
abc d ef
#include <iostream>
using namespace std;
int main()
{
// 从标准输入读取一行字符串
string s;
getline(cin, s);
// 遍历字符串中的每个字符
for (char c : s) {
// 如果字符不是数字,则输出
if (c > '9' || c < '0') {
cout << c;
}
}
// 输出换行符
cout << endl;
return 0;
}
改进
- 你是否可以使用 $O(1)$ 的空间复杂度完成此题,即在原数组上修改。
#include <iostream>
using namespace std;
int main()
{
// 从标准输入读取一行字符串
string s;
getline(cin, s);
int j = 0;
// 遍历字符串中的每个字符
for (int i = 0; i < s.length(); i++) {
// 如果字符不是数字,则保留该字符,并更新索引 j
if (s[i] > '9' || s[i] < '0') {
s[j++] = s[i];
}
}
// 在新字符串的末尾添加 null 终止符,以确保正确输出
s[j] = '\0';
// 输出处理后的字符串
cout << s << endl;
return 0;
}
改进点:
- 使用两个指针 i 和 j
- i 遍历整个原始字符串
- 如果遇到非数字字符,就将它赋值给 s[j],同时 j 向后移动
- 最后用 s.erase(j) 去除字符串最后多余的字符
- 直接在原字符串上修改,避免使用额外空间
时间复杂度不变:O(n)
空间复杂度改为:O(1) ,使用常数空间
总的来说,这种直接修改原数组的方法更节省空间。
二、统计各位上等于b的数字数目
一个整数 a 中,统计其中各位上等于 b 的数字数目。
其中 $0 ≤ b ≤ 9$ ,若 b 越界,输出“第二个参数越界”,否则输出正确结果。
输入格式
第一行包含整数N,表示多组数据。
接下来N行,每行包含2个整数a和b。
输出格式
共N行,每行输出一个结果
数据范围
$0 ≤ N ≤ 100000$
输入样例
3
123 2
12223 2
9999 10
输出样例
1
3
第二个参数越界
#include <iostream>
using namespace std;
int main()
{
// 读取输入的测试次数
int n;
cin >> n;
// 循环处理每个测试案例
while (n--) {
// 读取测试案例的两个参数
int a, b;
cin >> a >> b;
// 判断第二个参数是否越界
if (b > 9 || b < 0) {
puts("第二个参数越界!");
} else {
// 统计数字 b 在数字 a 中出现的次数
int res = 0;
while (a) {
if (a % 10 == b) {
res++;
}
a /= 10;
}
// 输出结果
cout << res << endl;
}
}
return 0;
}
3.建立一个学生在某一个课程到课情况统计程序。功能要求
(1)可一次性输入所有学生的到课情况,输入学生总人数,该课程总课时,学生学号及其到课情况,分为正常,迟到,请假,旷课;
(2)可统计某一个学生的到课情况的上课率 (包括正常、迟到、旷课率),并输出
(3)可统计所有学生的上课率,旷课率,并输出
1)写出所用的数据结构
2)写出算法描述
3)写出源程序
输入格式
第一行输入学生人数N和总课时M,用空格隔开。
接下来N行,每行依次输入学生的学号、正常上课次数、迟到次数、缺勤次数。
输入样例
5 6
1 2 3 1
2 3 1 2
3 2 2 2
4 6 0 0
5 5 1 0
输出样例
学号:1, 出勤率:0.83
学号:1:
总课时:6
正常:2
迟到:3
旷课:1
出勤率:0.833333
旷课率:0.166667
---------------------------
学号:2:
总课时:6
正常:3
迟到:1
旷课:2
出勤率:0.666667
旷课率:0.333333
---------------------------
学号:3:
总课时:6
正常:2
迟到:2
旷课:2
出勤率:0.666667
旷课率:0.333333
---------------------------
学号:4:
总课时:6
正常:6
迟到:0
旷课:0
出勤率:1
旷课率:0
---------------------------
学号:5:
总课时:6
正常:5
迟到:1
旷课:0
出勤率:1
旷课率:0
---------------------------
总正常次数: 18
总迟到次数: 7
总旷课次数: 5
平均出勤率: 0.833333
代码
#include<iostream>
#include<string>
using namespace std;
// 学生信息结构体
struct Student {
string id; // 学号
int normal; // 正常上课次数
int late; // 迟到次数
int absent; // 缺勤次数
int total; // 总课时
double attendRate; // 上课率
};
// 输入每个学生的信息
void inputStudentsInfo(Student students[], int n, int totalCourse) {
for (int i = 0; i < n; i++) {
cin >> students[i].id;
cin >> students[i].normal;
cin >> students[i].late;
cin >> students[i].absent;
students[i].total = totalCourse; // 设置每个学生的总课时
students[i].attendRate = (double) (students[i].normal
+ students[i].late) / totalCourse; // 计算上课率
}
}
// 打印一个学生的上课率
void printStudentRate(Student student) {
printf("学号:%s, 出勤率:%.2lf\n", student.id.c_str(), student.attendRate);
}
// 打印每个学生和总体的统计数据
void printAllStats(Student students[], int n, int totalCourse) {
// 遍历每个学生
for (int i = 0; i < n; i++) {
cout << "学号:" << students[i].id << ":" << endl;
cout << "总课时:" << students[i].total << endl;
cout << "正常:" << students[i].normal << endl;
// 打印每个字段
cout << "迟到:" << students[i].late << endl;
cout << "旷课:" << students[i].absent << endl;
cout << "出勤率:" << students[i].attendRate << endl;
// 计算旷课率
double absentRate = (double) students[i].absent / totalCourse;
cout << "旷课率:" << absentRate << endl;
puts("---------------------------");
}
int normalTotal = 0, lateTotal = 0, absentTotal = 0;
double attendRateTotal = 0;
// 统计每个字段的总和
for (int i = 0; i < n; i++) {
normalTotal += students[i].normal;
lateTotal += students[i].late;
absentTotal += students[i].absent;
attendRateTotal += students[i].attendRate;
}
cout << "总正常次数: " << normalTotal << endl;
cout << "总迟到次数: " << lateTotal << endl;
cout << "总旷课次数: " << absentTotal << endl;
cout << "平均出勤率: " << attendRateTotal / n << endl;
}
int main() {
int n, totalCourse; //输入
cin >> n >> totalCourse;
Student students[n]; //学生数组
inputStudentsInfo(students, n, totalCourse); //输入信息
printStudentRate(students[0]); //打印一个学生的上课率
printAllStats(students, n, totalCourse); //打印所有统计
return 0;
}