天天看点

1033 旧键盘打字(附详细注释,逻辑分析)

写在前面

  • 实现思路
    • 字符数组存放字符串
      • 字符串空值,

        scanf("%s", str);

        读取异常,

        cin.getline(str, maxn);

        有效,测试点2
      • 整型、布尔数组初始化,

        int hashTable[256]; memset(hashTable, 1, sizeof(hashTable));

  • 存在部分知识盲点,耗费近1个小时,多次提交
    • 理顺耗费时间较长(存在知识盲点)

测试用例

input:
7+IE.
7_This_is_a_test.
output:
_hs_s_a_tst

input:
NULL
7_This_is_a_test.
output:
7_This_is_a_test.
           

ac代码(优化后)

  • 参考算法笔记(代码无效)
#include <iostream>
#include <cstring>
using namespace std;

const int maxn = 100010;
int hashTable[256];
char str[maxn];
int main()
{
    memset(hashTable, 1, sizeof(hashTable));
    cin.getline(str, maxn);
    int len = strlen(str);
    for(int i=0; i<len; i++)
        hashTable[tolower(str[i])] = 0;

    cin.getline(str, maxn);
    len = strlen(str);
    for(int i=0; i<len; i++)
    {
        if(str[i]>='A' && str[i]<='Z')
        {
            if(hashTable[tolower(str[i])]>0 && hashTable['+']>0)
                printf("%c", str[i]);
        }
        else if(hashTable[str[i]]>0)
        {
            printf("%c", str[i]);
        }
    }

    return 0;
}
           

学习代码

  • 实现逻辑
    • 字符串查找函数实现(英文字母的坏键以大写给出)
      • 源大小写,大写找到,下一次循环
      • 源大写找不到,上档键坏掉,下一次循环
      • 源大写找不到,上档键正常,打印输出
      • 源小写、源特殊字符找不到,打印输出
#include <iostream>
#include <cctype>
using namespace std;
int main() {
  string bad, should;
  getline(cin, bad);
  getline(cin, should);
  for (int i = 0, length = should.length(); i < length; i++) {
    if (bad.find(toupper(should[i])) != string::npos) continue;
    if (isupper(should[i]) && bad.find('+') != string::npos) continue;
    cout << should[i];
  }
  return 0;
}
           

知识点小结

//  字符串最大长度, 4611686018427387897
string s;
cout << s.max_size() << endl;

memset(hashTable, 1, sizeof(hashTable));

// 空值读取1
char str[maxn];
cin.getline(str, maxn);
// 空值读取2
string bad, should;
getline(cin, bad);

// 字符串查找函数
bad.find(toupper(should[i])) != string::npos
           

继续阅读