文章

【GESP】C++三级真题 luogu-B3956 [GESP202403 三级] 字母求和

GESP三级真题,字符串和一维数组相关题目,难度★★☆☆☆。

luogu-B3956 [GESP202403 三级] 字母求和

题目要求

题目描述

小杨同学发明了一种新型密码,对于每一个小写英文字母,该小写字母代表了一个正整数,即该字母在字母顺序中的位置,例如字母 a 代表了正整数 $1$,字母 b 代表了正整数 $2$;对于每一个大写英文字母,该大写字母代表了一个负整数,即该字母的 ASCII 码的相反数,例如字母 A 代表了负整数 $-65$。小杨同学利用这种放缩对一个整数进行了加密并得到了一个由大写字母和小写字母组成的字符串,该字符串中每个字母所代表数字的总和即为加密前的整数,例如 aAc 对应的加密前的整数为 $1+(-65)+3=-61$。

对于给定的字符串,请你计算出它对应的加密前的整数是多少。

输入格式

第一行一个正整数 $n$,表示字符串中字母的个数。
第二行一个由大写字母和小写字母的字符串 T,代表加密后得到的字符串。

输出格式

输出一行一个整数,代表加密前的整数。

输入输出样例 #1

输入 #1

1
2
3
aAc

输出 #1

1
-61

说明/提示

对全部的测试数据,保证 $1 \leq n \leq 10^5$。


题目分析

解题思路

本题的解题思路比较简单直接:

  1. 输入处理:
    • 读取字符串长度n
    • 读取由大小写字母组成的字符串
  2. 字符串遍历处理:
    • 遍历字符串中的每个字符
    • 判断字符是大写还是小写字母
    • 对于小写字母,计算其在字母表中的位置(1-26)
    • 对于大写字母,取其ASCII码的负值
  3. 结果计算:
    • 累加每个字符对应的数值
    • 输出最终结果

复杂度分析:

  • 时间复杂度:$O(n)$,其中n为字符串长度
  • 空间复杂度:$O(1)$,只需要常数级别的额外空间


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>

int main() {
    // 定义字符串长度变量n
    int n;
    std::cin >> n;
    
    // 定义密码字符串变量
    std::string pwd;
    std::cin >> pwd;
    
    // 定义结果变量,用于累加各字符对应的数值
    int result = 0;
    
    // 遍历密码字符串的每个字符
    for (int i = 0; i < pwd.length(); i++) {
        // 如果是小写字母,加上字母顺序对应的正整数(a=1,b=2,...)
        if (std::islower(pwd[i])) {
            result += pwd[i] - 'a' + 1;
        }
        // 如果是大写字母,加上ASCII码的负值
        else {
            result -= pwd[i];
        }
    }
    
    // 输出最终结果
    std::cout << result;
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权