信息学奥赛第一节——字符串1(字符串的读取 + size函数 + 下标的使用)

本文主要是介绍信息学奥赛第一节——字符串1(字符串的读取 + size函数 + 下标的使用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

字符串string类

string是C++中STL标准模板库提供的字符串类,用来处理字符串相关的问题

字符串与字符数组的区别
  • 其实,字符串的本质依然是字符数组。只不过string是长度不固定的,或者说是长度不限的字符数组。在使用string类的时候,不要先定义长度,如char c[100]
  • 先定义一个字符数组c
char c[100];//c[0] == *c
  • 字符数组相关的函数比较少,string集成了很多的函数
  • 字符数组的本质是数组,故其不能直接进行比较或者拼接运算。string可以直接进行比较或拼接运算
  • 对于没有学习过字符数组的学生,也是可以直接学习string

通过下述代码,可以实现字符串的“加法操作”

#include <iostream>
#include <string>using namespace std;int main()
{string s;//加法操作s += "hello";s += ' ';s += "world!";cout << s << endl;//hello world!return 0;
}
字符串的读取
string s;//首先定义字符串

可以考虑两种读取方式:

  • 直接cin >> s
  • 使用函数getline(cin,s);

以上两种读取方式的区别是,前者不可以读入空格。而后者是读入一行字符换,字符串中可以有空格,遇到换行符时才结束

字符串的相关函数
  • s.size() —— 字符串的长度
  • s[下标] —— 访问字符串某个位置的元素

根据以上知识点,请完成下题
Acwing 760 字符串长度
AC代码:

#include <iostream>
#include <string>using namespace std;int main()
{string s;getline(cin,s);//读入一行字符串cout << s.size() << endl;//输出字符串的长度return 0;
}
练习1

原题链接

题目描述

看到两个标准格式的时间,有小时,有分钟,有秒,格式如:h : m : s,即 时:分:秒 你想知道,这两个时间之间相差多少吗?

输入

输入包括两行,两行均为一个“时:分:秒”格式的时间。且本题保证第一个时间一定大于第二个时间!

输出

输出就是输入的两个时间之间的秒数差。

样例输入

01:10:10
00:30:30

样例输出

2380

解题思路:先读入两个字符串,使用s[下标]的方法将其元素取出,然后将字符转换为数字,再进行运算即可。字符转化为数字的方法:s[x] - '0'
AC代码:

#include <iostream>
#include <string>using namespace std;//用来计算传入的字符串s可以转化为多少秒
int cal_second(string s)
{int h,m,second;//分别代表对应的小时、分钟、秒数h = (s[0] - '0') * 10 + s[1];m = (s[3] - '0') * 10 + s[4];second = (s[6] - '0') * 10 + s[7];int res = h * 3600 + m * 60 + second;return res;
}int main()
{string s1;string s2;getline(cin,s1);getline(cin,s2);cout << cal_second(s1) - cal_second(s2) << endl;return 0;
}
练习2

原题链接

题目描述

输入一个很大的数,求各位上的数字和。

输入

一个很大的整数(不超过200位)

输出

一个整数

样例输入

123

样例输出

6

解题思路:本题的解题思路和上题类似,直接遍历字符串中各个位置上的元素,先将各个字符转化为数字,再进行求和即可。
AC代码:

#include <iostream>
#include <string>using namespace std;//用来计算传入的字符串s各个位置上的数字之和
int cal_sum(string s)
{int res = 0;//res用来存储数字之和int len = s.size();for (int i = 0;i < len;i++) res += (s[i] - '0');return res;
}int main()
{string s1; getline(cin,s1);cout << cal_sum(s1) << endl;return 0;
}

在此简单介绍一下如何构造一些特殊的、方便自己计算的数据来进行代码的测试

  • 输入20个1,答案输出的应该是20
  • 输入20个0,答案输出的应该是0
  • 对样例进行测试,应该输出6
  • 不要输入123456789101112131415,这样不方便自己对代码进行测试
练习3

原题链接

题目描述

Julius Caesar曾经使用过一种很简单的密码。对于明文中的每个字符,将它用它字母表中后5位对应的字符来代替,这样就得到了密文。比如字符A用F来代替。如下是密文和明文中字符的对应关系。
密文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
明文:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
你的任务是对给定的密文进行解密得到明文。
你需要注意的是,密文中出现的字母都是大写字母。密文中也包括非字母的字符,对这些字符不用进行解码。

输入

一行,给出密文,密文不为空,而且其中的字符数不超过200。

输出

输出一行,即密文对应的明文

样例输入

NS BFW, JAJSYX TK NRUTWYFSHJ FWJ YMJ WJXZQY TK YWNANFQ HFZXJX

样例输出

IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES

解题思路:通过题意可以得到,将明文向后移动五个位置得到密文,那么将密文向前移动五个位置就可以得到明文。但是在将密文转化为明文(向前移动)的过程中,需要考虑到英文字母表的前五个字符会超出界限,故'A'、'B'、'C'、'D'、'E'需要单独处理才可以得到其对应的明文,且通过观察,我们不难发现以下规律:

A + V - A = V
B + V - A = W
C + V - A = X
D + V - A = Y
E + V - A = Z

AC代码1

#include <iostream>
#include <string>using namespace std;//用来将传入的字符串s各个位置上的字符向前移动五个位置
string mi_to_ming(string s)
{int len = s.size();//计算字符串的长度for (int i = 0;i < len;i++){if (s[i] >= 'A' && s[i] <= 'Z')//是大写字母才对其进行解密{if (s[i] >= 'F' && s[i] <= 'Z') s[i] = s[i] - 5;//是大写字母且不超过界限else s[i] = s[i] + 'V' - 'A';//移动过程中超过界限的字符需要单独处理}}return s;
}int main()
{string s1; getline(cin,s1);cout << mi_to_ming(s1) << endl;return 0;
}

AC代码2

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>using namespace std;string mi_to_ming(string s)
{int len = s.size();for (int i = 0;i < len;i++){if (s[i] >= 'F' && s[i] <= 'Z') s[i] -= 5;//F ~ Zelse {if (s[i] == 'A') s[i] = 'V';else if (s[i] == 'B') s[i] = 'W';else if (s[i] == 'C') s[i] = 'X';else if (s[i] == 'D') s[i] = 'Y';else if (s[i] == 'E') s[i] = 'Z';}}return s;
}int main()
{string s;  getline(cin,s); string ans = mi_to_ming(s);cout << ans << endl;return 0;
}

这篇关于信息学奥赛第一节——字符串1(字符串的读取 + size函数 + 下标的使用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash