解题过程的小记录,如有错误欢迎指出。
难度:一星
题目分析
给出两个字符串,要求输出去掉第二个字符串存在的内容后的第一个字符串。
注意点
- 本题可以用hash散列来做,如果用了iostream和using namespace std就尽量不要使用hash这个变量名,若设置为全局变量会造成冲突报错(类似的还有math.h中的y1)
- 怎样读入一整行带空格的字符串需要记住(我选择getline(cin,str))
我的解题过程
思路
输入两串字符串,对第一串字符串进行逐个扫描,输出没有在第二个字符串中出现过的字符。
bug
无,顺~(不过本来担心会超时的说,都做好改成hash的准备了,结果乌拉)
代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1,s2;
getline(cin, s1);
getline(cin, s2);
//int hash[130] = { 0 };
for (int i = 0; i < s1.size(); i++) {
if (s2.find(s1[i]) == string::npos) cout << s1[i];
}
return 0;
}
dalao的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
- 如果用strlen的话不要放在循环体内,否则你每一次循环都会逐个计算一遍会超时
- 注意一下以char的输入带空格的用法
(本题可以用hash散列做,以下是柳神代码)
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
char s1[100000], s2[100000];
int main() {
cin.getline(s1, 100000);
cin.getline(s2, 100000);
int lens1 = strlen(s1), lens2 = strlen(s2);
bool flag[256] = {false};
for(int i = 0; i < lens2; i++)
flag[s2[i]] = true;
for(int i = 0; i < lens1; i++) {
if(!flag[s1[i]])
printf("%c", s1[i]);
}
return 0;
}