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

相关文章

人机的三级抽象

数学的三级抽象包括第一级抽象是数表示万物、第二级抽象是字母表征数、第三级抽象是运算规则的抽象(如群论),在人机交互中,类比于数学的三级抽象,可以理解为: 第一级抽象:用户界面和操作的抽象化。这一级别涉及到将用户与计算机之间的交互过程抽象化,使得用户可以通过直观的界面和操作来控制计算机或者访问信息。例如,图形用户界面 (GUI) 将复杂的计算机功能和操作抽象为图标、按钮和菜单,使用户能够轻松地进行

leetcode刷题(44)——242. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true 示例 2: 输入: s = “rat”, t = “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

SQL是如何支持三级模式的

文章目录 三级模式的详细描述SQL 如何支持三级模式1. 支持内部模式2. 支持概念模式3. 支持外部模式 示例总结 问题讲解——SQL是如何支持三级模式的 在数据库系统中,三级模式(Three-Schema Architecture)是由ANSI/SPARC数据库管理系统标准委员会在1970年代提出的一个框架,用来描述数据库系统的体系结构。它包含三个不同的层次:内部模式

根据序列:2/1,3/2,5/3,...生成前30项打印出并求和

根据斐波那契数列 def fab(max): def fib_loop_while(max):max = maxa, b = 0, 1while max &

和、字母数字对应的ASCII码。

打印A、Z;a z   0   9对应的ASCII码。 System.out.println("A:"+(int)'A');System.out.println("Z:"+(int)'Z');System.out.println("--------------------------");System.out.println("a:"+(int)'a');Sy

一个整数使用英文表达的字母计数

题目: 把1到5写成英文单词分别是:one、two、three、four、five。这些单词一共用了3+3+5+4+4 = 19 个字母。 如果把1到1000都写成英文单词,一共要用多少个字母? 注:不计入空格和连字符,例如,342,three hundred and forty-two, 包含23哥字母,而115(one hundred and fifteen)包含20个字母。单词“and

前端算法题----三数求和问题

算法题讲解 真题描述: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。 示例1: 输入:nums = [-1,0,

力扣316.去除重复字母

力扣316.去除重复字母 从左到右遍历每个字母 若当前字母比栈顶字母小 并且右边仍然后栈顶字母出现弹出栈顶字母 最后加入当前字母 class Solution {public:string removeDuplicateLetters(string s) {//记录每个字母出现次数;当前字符串中字母是否出现vector<int> left(26),in_ans(26);for(char

go语言进阶实战学习(逐行注释)(1):两协程并发交替打印数字和字母

要求: 并发两协程交替打印数字和字母。一个协程打印数字,一个协程打印字母。 输出: 12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728 思路: 两个 channel 控制两个协程进行交替打印。sync.WaitGroup 控制主协程等待子协程完成。 完整代码: package mainim

高斯算法的原理及其与常规求和方法的区别

高斯算法的原理 高斯算法的原理源于数学家卡尔·弗里德里希·高斯在他少年时期发现的一种求和方法。当时老师让学生们计算1到100的和,高斯发现了一种快速计算的方法。 高斯注意到,如果将序列的首尾两数相加,结果总是相同的。例如: [ 1 + 100 = 101 ][ 2 + 99 = 101 ][ 3 + 98 = 101 ]... 这样,一共有50对数,每对数的和都是101。因此,1到