B3956 [GESP202403 三级] 字母求和

2024-05-29 17:44

本文主要是介绍B3956 [GESP202403 三级] 字母求和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[GESP202403 三级] 字母求和

题目描述

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

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

3
aAc

样例输出 #1

-61

提示

对全部的测试数据,保证 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105

方法1
解题思路

本题要求我们计算给定字符串中每个字母所代表数字的总和。根据题目描述,对于小写字母,其代表的是字母在字母表中的位置;对于大写字母,其代表的是字母的 ASCII 码的相反数。

我们可以遍历字符串中的每个字符,判断其是大写字母还是小写字母,并计算相应的数值,累加到总和中。

具体步骤如下:

  1. 定义变量 sum,用于存储字母所代表数字的总和,初始化为 0。

  2. 遍历字符串中的每个字符 c:

    • 如果 c 是小写字母,将 c - 'a' + 1 的值加到 sum 上。
    • 如果 c 是大写字母,将 -(c) 的值加到 sum 上。
  3. 输出 sum 的值作为答案。

C++代码

#include <string>
#include <iostream>
using namespace std;int main() {int n;string T;cin >> n >> T;int sum = 0;for (char c : T) {if (islower(c)) {sum += c - 'a' + 1;} else {sum -= c;}}cout << sum << endl;return 0;
}

代码解释

  1. 首先,我们读取字符串的长度 n 和字符串 T

  2. 定义变量 sum,用于存储字母所代表数字的总和,初始化为 0。

  3. 使用范围循环遍历字符串 T 中的每个字符 c

  4. 对于每个字符 c,使用 islower(c) 函数判断其是否为小写字母:

    • 如果是小写字母,将 c - 'a' + 1 的值加到 sum 上。这里 c - 'a' + 1 计算的是字母 c 在字母表中的位置。
    • 如果是大写字母,将 -(c) 的值加到 sum 上。这里 -(c) 表示字母 c 的 ASCII 码的相反数。
  5. 输出 sum 的值作为答案。

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串的长度。我们需要遍历字符串中的每个字符。

  • 空间复杂度: O ( 1 ) O(1) O(1)。我们只使用了常数级别的额外空间。

输入输出样例

输入:

3
aAc

输出:

-61

该解决方案通过遍历字符串中的每个字符,判断其是大写字母还是小写字母,并计算相应的数值,最终得到字母所代表数字的总和。时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)

方法2

C++代码

#include <iostream>
#include <string>
using namespace std;int main() {int n;string T;cin >> n >> T;int sum = 0;for (char c : T) {if (c >= 'a' && c <= 'z') {sum += c - 'a' + 1;} else {sum -= c;}}cout << sum << endl;return 0;
}

代码解释

在这个修改后的代码中,我们只改变了判断字符是大写字母还是小写字母的条件:

if (c >= 'a' && c <= 'z') {sum += c - 'a' + 1;
} else {sum -= c;
}
  • 如果字符 c 的 ASCII 码在 ‘a’ 到 ‘z’ 的范围内,说明它是小写字母,我们将 c - 'a' + 1 的值加到 sum 上。
  • 否则,字符 c 是大写字母,我们将 -(c) 的值加到 sum 上。

这种方式直接使用字符的 ASCII 码进行判断,避免了使用 islower 函数。

其他部分的代码保持不变。

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串的长度。我们需要遍历字符串中的每个字符。

  • 空间复杂度: O ( 1 ) O(1) O(1)。我们只使用了常数级别的额外空间。

输入输出样例

输入:

3
aAc

输出:

-61

这种修改只是改变了判断字符是大写字母还是小写字母的方式,使用字符的 ASCII 码进行判断,而不依赖于 islower 函数。代码的整体逻辑和复杂度分析保持不变。

这篇关于B3956 [GESP202403 三级] 字母求和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014213

相关文章

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

1 模拟——67. 二进制求和

1 模拟 67. 二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1:输入:a = "11", b = "1"输出:"100"示例 2:输入:a = "1010", b = "1011"输出:"10101" 算法设计 可以从低位到高位(从后向前)计算,用一个变量carry记录进位,如果有字符没处理完或者有进位,则循环处理。两个字符串对

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

Leetcode67---二进制求和

https://leetcode.cn/problems/add-binary/description/ 给出的两个二进制,我们可以从最后开始往前运算。 给当前短的一位前面补充0即可。 class Solution {public String addBinary(String a, String b) {//给的就是二进制字符串 最后一位开始遍历 如果没有就补充0?StringBuil

UVa 10820 Send a Table (Farey数列欧拉函数求和)

这里先说一下欧拉函数的求法 先说一下筛选素数的方法 void Get_Prime(){ /*筛选素数法*/for(int i = 0; i < N; i++) vis[i] = 1;vis[0] = vis[1] = 0;for(int i = 2; i * i < N; i++)if(vis[i]){for(int j = i * i; j < N; j += i)vis[j] =

【hdu】敌兵布阵(线段树,更加结点,区间求和)

最近开始刷线段树,主要围绕notonlysuccess的线段树总结刷。 结点修改还是比较简单的,不需要什么懒惰标记,直接二分递归就可以了。 #include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vecto

上海市计算机学会竞赛平台2024年7月月赛丙组求和问题

题目描述 给定 nn 个整数 a1,a2,…,ana1​,a2​,…,an​,请问这个序列最长有多少长的前缀,满足元素的和大于或等于 00?如果任何长度大于 00 的前缀之和都为负数,则输出 00 输入格式 第一行:单个整数表示 nn第二行:nn 个整数表示 a1,a2,…,ana1​,a2​,…,an​ 输出格式 单个整数:表示最长的前缀长度,使得前缀的和大于等于 00 数据范围

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in

兔子--EditText去除下划线和输入字母和数字的限制

在设置密码输入框的时候,只允许输入数字和字母,设置如下属性:  android:digits="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 设置密码不可见(显示小黑点),并去除edittext的获取到焦点时候的下划线, 设置如下: