本题要求你计算A?B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A?B。 输入格式: 输入在2行中先后给出字符串A和B。两字符串的长度都不超过10000并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。 输出格式: 在一行中打印出A?B的结果字符串。 思路:存入A,B。(A,B的大小一定要为10001,不然会有两个点过不了测试)创建一个大小等于ASCII码的数组,初始化为0,然后将ASCii数组中B出现过的字符对应ASCII码的值改为1。我一开始的想法是把A中出现过的数字全部删除掉再输出A(这里用了一下顺序表中学到的删除几个字符时间复杂度为O(n),空间复杂度为1的算法),后来发现只输出未出现的就可以了。两版代码都放在下面,都可以参考参考。
聪明点的
#include<iostream>
#include<vector>
using namespace std;
int main()
{
char s1[10001], s2[10001];
cin.getline(s1, 10001);
cin.getline(s2, 10001);
vector<int> adjust(256, 0);
int k = 0;
while (s2[k]!='\0')
{
if (adjust[s2[k]] == 0)
{
adjust[s2[k]]++;
}
k++;
}
int j = 0;
while (s1[j] != '\0')
{
if(adjust[s1[j]]==0)
{
cout<<s1[j];
}
j++;
}
}
笨一点的
#include<iostream>
#include<vector>
using namespace std;
int main()
{
char s1[10001], s2[10001];
cin.getline(s1, 10001);
cin.getline(s2, 10001);
vector<int> adjust(129, 0);
int k = 0;
while (s2[k]!='\0')
{
if (adjust[s2[k]] == 0)
{
adjust[s2[k]]++;
}
k++;
}
int j = 0;
k = 0;
do
{
s1[j - k] = s1[j];
if (adjust[s1[j]] == 1)
{
k++;
}
j++;
} while (s1[j-1] != '\0');
j = 0;
while (s1[j] != '\0')
{
cout << s1[j];
j++;
}
}
|