【PAT】1084 Broken Keyboard (20 分)

46 篇文章 0 订阅
44 篇文章 0 订阅
  • 题目大意:找出键盘中坏掉的字符。

  • 思路1(我的思路):

    1. 检测s1[i]和s2[j],若不同,就i++,检测s1[i]是否在要输出的数组s3[size]里,若不存在,就判断s1[i]是为小写字母,若为小写字母,变成大写字母,然后插入s3[size],size++;若相同,就i++j++

    2. 输出s3[size]时,注意要将字符数字变成int类型。

    3. 代码:

      #include <iostream>
      #include <string>
      using namespace std;
      int N = 256;
      
      char capitalize(char c){
          if(c >= 97 && c <= 122)  // 小写字母的ASCII从97开始
              return c - 32;  // 将大写字母转换成小写字母(大写字母的ASCII从65开始)
          else
              return c;
      }
      
      bool isString(char *s, int size, char c){
          if(size == 0){
              return false;
          }
          else{
              for(int i = 0; i < size; i++){
                  c = capitalize(c);  // 确保小写字母变成大写字母
                  if(c == *(s + i))
                      return true;
              }
              return false;
          }
      }
      
      bool isNum(char c){
          if(c >= 48 && c <= 51)  // 数字的ASCII从48开始
              return true;
          return false;
      }
      
      
      int main() {
          // input
          string s1, s2;
          cin >> s1 >> s2;
      
          // s1下标,s2下标,s3大小
          int i = 0, j = 0, size = 0;
          // 存缺少的字母
          char s3[N];
      
          // 遍历s1 s2
          while(i != s1.length()){
              if(s1[i] != s2[j]){ // 发现缺少的字母时
                  // 将缺少的字母存入s3
                  if(!isString(s3, size, s1[i])){ // 判断字符在不在s3中
                      char c = capitalize(s1[i]); //判断字母是否为大写,并将小写字母转成大写
                      s3[size++] = c; // 将字符存入s3
                  }
                  i++;    // s1的下标+1
              }
              else{ // 若键盘正常,两个字符串的下标都+1
                  i++;
                  j++;
              }
          }
      
          // 输出s3
          for(int i = 0; i < size; i++){
              // 若为数字,就将字符转化成数字再输出
              if(isNum(s3[i]))   printf("%d", s3[i] - 48);
              else    printf("%c", s3[i]);
          }
          return 0;
      }
      
  • 思路2(柳诺的思路):

    1. string.find()查找s2中是否存在s1[i]

    2. 代码:

      #include <iostream>
      #include <cctype>
      #include <string>
      using namespace std;
      
      int main() {
          string s1, s2, s3;
          cin >> s1 >> s2;
          for(int i = 0; i < s1.length(); i++)
              if(s2.find(s1[i]) == string::npos && s3.find(toupper(s1[i])) == string::npos)
                  s3 += toupper(s1[i]);
          cout << s3;
          return 0;
      }
      
  • 总结

    1. C语言定义数组的方法:

      1. int a[] = {1, 2, 3}; // 不定长数组,长度由元素个数决定。
      2. int a[N]; // 定长数组 。
      3. int *a; // 定义指针
    2. C语言往函数传数组的方法:

      1. int fuc(int *a, int size){int n = *(a + 0)}; // 传入指针和大小两个变量
      2. int fuc(int a[], int size){}; // 传入数组和大小两个变量
      3. int fuc(int a[10]){}; // 只传入数组一个变量
    3. 查找字符串a是否包含子串b,不是用strA.find(strB) > 0 而是 strA.find(strB) != string:npos

    4. C++中tolower()函数是把字符串都转化为小写字母,touppre()函数是把字符串都转化为大写字母。

      注意:要#include <cctype>

    5. 注意:检查s3中是否存在字符时要将该字符转换成大写字符;

    6. 写代码的习惯不好,经常会犯很傻很低级的错误;

    7. 思路还是断开了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值