题目链接:
一、自己的想法:(弱化版双指针)
思路为用两个“指针”i, j分别指向原来字符串和实际输入字符串的第一个字符,然后判断i,j所指字符是否一致,若是则i, j同时++,若否则将i所指的字符存储进字符串c中,同时让i++.
第一遍代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a, b, c;
cin >> a >> b;
int k = 0;
int lena = a.size();
for (int i = 0, j = 0; i < lena;){
if (a[i] != b[j]){
c[k++] = a[i];
i++;
}
else {
i++;
j++;
}
}
for (int j = 0; j < k - 1; ++j){
for (int i = j + 1; i < k; ++i){
if (toupper(c[i]) == toupper(c[j])) c[i] = '#';
}
}
for (int i = 0; i < k; ++i){
if (isdigit(c[i])) cout << c[i];
else if (isalpha(c[i])) cout << (char)toupper(c[i]);
else if (c[i] == '_') cout << c[i];
}
return 0;
}
发现第五个样例 “运行时错误”。
这是因为c字符串默认为空串,不能使用c[k++] = …的写法,这样会造成下标越界的错误,需改为c += …
(只能使用size中的空间,不能使用capacity中的空间),字符串的大小或长度(size)是指该字符串实际容纳的字符数,而字符串的容量(capacity)是该字符串最多容纳的字符数。
参考:vector容器中size与capacity的区别
size与capacity的区别
一般地,“运行时错误” 还包括这些:
return value 255:当0作为除数是就会报这样的错。
return value 3221225620:当运行时出现错误时会报这样的错。
return value 3221225477:访问越界时会报这样的错。
return value 3221225725:一般在无穷递归或空间太大时报这样的错。
修改之后的完整代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a, b, c;
cin >> a >> b;
int k = 0;
int lena = a.size();
for (int i = 0, j = 0; i < lena;){
if (a[i] != b[j]){
c += a[i];
i++;
}
else {
i++;
j++;
}
}
for (int j = 0; j < c.size() - 1; ++j){
for (int i = j + 1; i < c.size(); ++i){
if (toupper(c[i]) == toupper(c[j])) c[i] = '#';
}
}
for (int i = 0; i < c.size(); ++i){
if (isdigit(c[i])) cout << c[i];
else if (isalpha(c[i])) cout << (char)toupper(c[i]);
else if (c[i] == '_') cout << c[i];
}
return 0;
}
另解:(参考1029. 旧键盘(20)-PAT乙级真题)
考虑使用C++中的find函数。
分析:用string的find函数,遍历字符串s1,当当前字符s1[i]不在s2中,它的大写也不在ans中时,将当前字符的大写放入ans中,最后输出ans字符串即可。
代码如下:
#include <iostream>
#include <cctype>
using namespace std;
int main() {
string s1, s2, ans;
cin >> s1 >> s2;
for (int i = 0; i < s1.length(); i++)
if (s2.find(s1[i]) == string::npos && ans.find(toupper(s1[i])) == string::npos)
ans += toupper(s1[i]);
cout << ans;
return 0;
}
/* 以下为补充知识 */ ,参考find()函数及其他常用函数总结
C++中,字符串string自带find函数(包含于头文件#include <string>
中)
find函数可用于在字符串a中查找另一个子串b,或者在字符串中查找单个字符。本题主要使用的是后者。如果找不到,则返回值为string::npos ,即对于string,通过a.find(val) == string::npos来做判断是否查找成功。
示例1:
string s1;
char c;
if(s1.find(c) != string::npos){ //查找字符
printf("字符c在s1中的起始下标为%d\n", s1.find(c));
}else{
printf("s1中不存在字符c");
}
示例2:(用于计算一个字符串中有多少不重复的字符数)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
getline(cin, str);
int count = 0;
for (int i = 0; i <= 127; i++)
if (str.find(i) != string::npos)
count++;
cout << count;
}