1029 旧键盘 (20 分)(C++)

在这里插入图片描述

Notice:
思路:
1.找到坏的键:应该输入字符串s1,实际输入s2.
	所以只需要在s2中依次寻找s1中没有的键值。
2.防止重复输出坏健:利用一个Hash表去判断之前是否输出过.
思考:
1.这道题属实给我写吐了。。最后测试点4死活过不了。
	最后发现是判断小写字母时候忘加"="号了。
	我的:if(s1[i] > 'a' && s1[i] < 'z') s1[i] -= 32;
	正解:if(s1[i] >= 'a' && s1[i] <= 'z') s1[i] -= 32;
	所以测试点4肯定有'a' 或者'z'.
2.关于cout << toupper(s[i]); 我发现它有些时候不是输出字符,而是输出ascii码。
	可改为cout << (char)toupper(s[i]);
3.循环嵌套里的i\j\k老是写错或者写重。。

4.string::npos 用以作为find函数失配时候的返回值.
5.str.find(str2)当str2是str的子串时,返回其在str中第一次出现的位置;
	不是子串,返回string::npos
  str.find(str2,pos),从str的pos号位置开始匹配str2.	

我的代码

#include <iostream>
#include <cctype>
using namespace std;
int main (){
    string s1,s2;
    bool Hash[128] = {false}; //用一个哈希表来标记是否已经输出过了
    cin >> s1 >> s2;
    
    //判断是否在s2中出现,注意键盘上T(大写)和t(小写)是一个键
    int flag;
    for(int i = 0;i < s1.length();i++){
        flag = 0;
        //判断是否在s2中出现,flag为标记
        for(int k = 0;k < s2.length();k++){ //若为小写,比较前先统一转换为大写字母
            if(s1[i] >= 'a' && s1[i] <= 'z') s1[i] -= 32; //= toupper(s1[i]);
            if(s2[k] >= 'a' && s2[k] <= 'z') s2[k] -= 32;
            	//if(islower(s1[i]))s1[i] -= 32;
            	//if(islower(s2[k]))s2[k] -= 32;
            if(s1[i] == s2[k]){
                flag = 1;
                break;
            }
        }
        //输出
        if(flag == 0){
            if(Hash[s1[i]] != true){
                cout << s1[i]; //s2中未出现,且没有输出过,则输出
                	//printf("%c",s1[i]);
                Hash[s1[i]] = true;
            }
        }
    }
 return 0;
}

柳诺的代码

#include <iostream>
//#include <string>
#include <cctype>
using namespace std;
int main(){
    string s1,s2,ans;
    cin >> s1 >> s2;
    //若没在s2中和ans字符串中找到,则大写之后加入ans中,最后输出ans
    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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值