B1033 旧键盘打字 (20分)——能被打出的结果

2020-01-29  本文已影响0人  km15

// B1033 旧键盘打字 (20分).cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
考察:给出坏键跟一串字符,打出好的,(hash)

编程思想:
编程思想:
1、输入第一个字符,如果是大写字母就转为小写字符,把hashtable置为false
2、输入第二个字母,如果是大写字母,+档并且hashtable都成立,就可以输出大写,不是的话,判断hashTABLE是否成立,成立则输出,不然不输出

其中对应英文字母的坏键以大写给出,这里是告诉你大小写都不能输出了!

learn && wrong;
1、hashtable所有应该是256;
2、大写化为小写是,str[i] - 'A' + 'a',也可以单独,弄成+32,不过要暂存在char c中,直接输出c - 32,是个数字
3、思路值得学习
4、memset函数,可以设置true,其实因为true是单个字节,memset只针对单个字节,参数(数组,字节,sizeof()),头文件是<string.h>,另外menset可以用于结构体,结构体数组
*/


#include <iostream>
#include <cstring>
using namespace std;

bool hashtable[256]; //(!!!)初始全是false

char str1[100005];
char str2[100005];

void init() {
    for (int i = 0;i < 128;++i) {
        hashtable[i] = true;
    }
}

int main()
{
    cin >> str1 >> str2; //输入两行字符
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    bool flag = true;
    init();

    for (int i = 0;i < len1;++i) {  //hash置为false
        char c1 = str1[i];
        if (c1 >= 'A' && c1 <= 'Z') c1 += 32;  //-'A'是转为数字,而不是转为小写,加32才是
        hashtable[c1] = false;
        //if (c1 == '+') flag = false;
    }
    
    for (int j = 0;j < len2;++j) {
        char c2 = str2[j];
        if (hashtable['+'] == false && (c2 >= 'A' && c2 <= 'Z')) continue;  //短路了,flag必定为false,c2也大于等于A
        else if (hashtable[c2] == false) continue;
        else cout << c2;
    }
    cout << endl;
}

// 正确答案,B1033 旧键盘打字 (20分)——能被打出的结果.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
/*
编程思想:
1、输入第一个字符,如果是大写字母就转为小写字符,把hashtable置为false
2、输入第二个字母,如果是大写字母,+档并且hashtable都成立,就可以输出大写,不是的话,判断hashTABLE是否成立,成立则输出,不然不输出
*/

#include <iostream>
#include <cstring>
using namespace std;

const int maxn = 100010;
char str[maxn];

bool hashtable[256];

void intit() {
    for (int i = 0;i < 256;++i) {
        hashtable[i] = true;
    }
}
int main()
{
    cin >> str;
    intit();
    int len = strlen(str);
    for (int i = 0;i < len;++i) {
        if (str[i] >= 'A' && str[i] <= 'Z') {
            str[i] = str[i] - 'A' + 'a';
        }
        hashtable[str[i]] = false;
    }

    cin >> str;
    len = strlen(str);
    for (int i = 0;i < len;++i) {
        if (str[i] >= 'A' && str[i] <= 'Z')
        {
            int low = str[i] - 'A' + 'a';
            if (hashtable['+'] == true && hashtable[low] == true) { //这个并不是判断小写是否成立,而是判断大写是否为真,肯定是真啊
                cout << str[i];
            }
                
        }
        else if (hashtable[str[i]] == true) cout << str[i];
    }
    printf("\n");
    return 0;
}

上一篇 下一篇

猜你喜欢

热点阅读