字符串习题

单词个数统计

原作:

输入: 一行字符串。仅有空格和英文字母构成。

输出:

英文字母个数letter_num

单词个数word_num

出现最多的字母max_letter

出现最多的字母的出现次数max_letter_frequ

处理:

  1. 统计并输出此句子英文字母的个数;

  2. 统计并输出此句子中单词的个数;

  3. 查找此句子中出现次数最多的字母(不区分大小写,大小写字母是相同的)及次数。当出现最多的字母不止一个时,全部找到,并输出找到的所有字母及次数。(输出顺序按字母顺序,且输出时字母全部小写)

int main() {//输入:一行字符串。仅有空格和英文字母构成。 char arr[1024];string s;fgets(arr, sizeof(arr), stdin);s = arr;//英文字母个数int letter_num = 0;//单词的个数int word_num = 0;map<char,int> myMap;//处理//统计并输出此句子英文字母的个数for (int i = 0; i < s.size(); i++) {if (s[i] != ' ') {letter_num++;//将s[i]统一转成小写if (s[i] >= 'A' && s[i] <= 'Z') {s[i] += 32;}myMap[s[i]]++;if (s[i] == ' ' && s[i + 1] != ' ') {word_num++;}}}//输出:英文字母的个数printf("%d\n", letter_num);//输出:单词的个数printf("%d\n", word_num);//输出:出现次数最多的字母map<char,int>::iterator it;
​//找到字母出现的最多次数int max = 0;for (it=myMap.begin(); it != myMap.end(); it++) {if (it->second > max) {max = it->second;}}//找到值为max的所有键vector<char>max_letters;for (it = myMap.begin(); it != myMap.end(); it++) {if (it->second == max) {max_letters.push_back(it->first);}}//打印输出max_letters数组中的值for (int i = 0; i < max_letters.size(); i++) {printf("%d ", max_letters[i]);}printf("\n");return 0;
}

代码分析

上述代码存在几处的错误,我们来解释一下:

1.输入语句发生错误:

scanf("%s", arr);

%s 读取遇到空格就结束了,所以无法读入整行句子。句子有空格的话,后面的内容根本读不到。

应改为:

fgets(arr, sizeof(arr), stdin);

2.英文字母个数,单词个数统计错误:

按照上面的写法, 会把非空格的字符都算进去,但题目要求只统计英文字母个数。 即 如果 s[i] 是换行符 \n,也会被统计进去。

正确的改法应该是:

if ( (s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= 'a' && s[i] <= 'z') ) {letter_num++;
}

或者用 isalpha(s[i])。 isalpha() 是标准C库函数,作用是判断字符是否为英文字母(A-Z,a-z)。

对于统计单词个数:你要使用上述的这个语句来统计单词个数,得先去掉开头和结尾的空格。

或者推荐使用下列的做法:

bool in_word = false;
for (int i = 0; i < s.size(); i++) {if (isalpha(s[i])) {if (!in_word) {word_num++;in_word = true;}} else if (s[i] == ' ') {in_word = false;}
}

正确代码

#define  _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include <stdio.h>
#include<string>
#include<vector>
#include<map>
​
using namespace std;
​
int main() {//输入:一行字符串。仅有空格和英文字母构成。 char arr[1024];string s;fgets(arr, sizeof(arr), stdin);s = arr;//英文字母个数int letter_num = 0;//单词的个数int word_num = 0;map<char,int> myMap;//处理//统计并输出此句子英文字母,单词的个数bool in_word = false;//标记是否在单词中for (int i = 0; i < s.size(); i++) {if (isalpha(s[i])) {letter_num++;//统一转成小写,再加入myMapchar ch = tolower(s[i]);myMap[ch]++;//再统计单词if (!in_word) {word_num++;in_word = true;}}else if (s[i] == ' ') {in_word = false;//遇到空格说明单词结束}}//输出:英文字母的个数printf("%d\n", letter_num);//输出:单词的个数printf("%d\n", word_num);//输出:出现次数最多的字母map<char,int>::iterator it;
​//找到字母出现的最多次数int max = 0;for (it=myMap.begin(); it != myMap.end(); it++) {if (it->second > max) {max = it->second;}}//找到值为max的所有键vector<char>max_letters;for (it = myMap.begin(); it != myMap.end(); it++) {if (it->second == max) {max_letters.push_back(it->first);}}//打印输出max_letters数组中的值for (int i = 0; i < max_letters.size(); i++) {printf("%c ", max_letters[i]);}printf("\n");//打印输出出现最多的字母的出现次数printf("%d\n", max);return 0;
}

浮点数加法

原作:

输入:有2行,分别表示两个加数num1 num2

输出: 一个小数部分不为0的浮点数

处理: 求2个浮点数相加的和

思路:

我们要运算的数已经超过了浮点数精度,称此类问题为高精度计算。

此题给的两个数都超过了float和double的精度,所以我们可以把他们表示为两个字符串,进行运算。

我们要做的实际上就是用字符串模拟小学时学的竖式计算。

1)对齐:把小数点的位置对齐

2)先计算右边的小数,即进行小数运算

3)再进行左边的整数,即进行整数运算

对于运算的过程:从右往左算,且计算的是a+b+进位(carry)%10

对于整数的运算,因为两个加数的位数可能不一样,所以我们要实现i,j分别指向两个加数,我们运算的结束条件是,a没访问完或者b没访问完或者carry==1(即可能存在两个都访问完了,但还有进位的情况,例如11+99,在11和99的岗位都访问完了,还要向前再加一位)

#define  _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include <stdio.h>
#include<string>
using namespace std;
/*
参数:一个字符串a
返回值:a的整数部分
处理:提取a的整数部分
*/
string GetInteger(string a) {return a.substr(0, a.find('.'));
}
//提取a的小数部分
string GetFraction(string a) {return a.substr(a.find('.') + 1);
}
​
/*
处理:获取小数计算的结果,已经最终的进位
因为返回值只能返回一个,我们要两个结果,故我们都使用引用进行传递。
*/
void FractionPlus(string& res, int& carry, string fa, string fb) {
​int size = max(fa.size(), fb.size());while (fa.size() < fb.size()) {fa.push_back('0');}while (fb.size() < fa.size()) {fb.push_back('0');}//开始运算res.resize(size);//给res申请内存空间carry = 0;for (int i = size - 1; i >= 0; i--) {//'0'='0'//'3'='0'+'3'if (fa[i] + fb[i] + carry - '0' > '9') {res[i] = fa[i] + fb[i] +carry- '0' - 10;carry = 1;}else {res[i] = fa[i] + fb[i] + carry - '0';carry = 0;}}return;
}
/*
进行整数运算,整数加法运算不需要修改进位值,只需要获取小数运算得到的
进位值
*/
void IntegerPlus(string& res, int carry, string ia,string ib) {res.clear();for (int i = ia.size() - 1, j = ib.size() - 1; i >= 0 || j >= 0 || carry == 1; --i, --j) {//a,b都还没访问完if (i >= 0 && j >= 0) {if (ia[i] + ib[j] + carry - '0' > '9') {//结果要插入到上一个结果的前面res.insert(res.begin(), ia[i] + ib[j] + carry - '0' - 10);carry = 1;}else {res.insert(res.begin(), ia[i] + ib[j] + carry - '0');carry = 0;}//只有a的情况           }else if (i >= 0 &&j < 0) {if (ia[i] + carry > '9') {//结果要插入到上一个结果的前面res.insert(res.begin(), ia[i] + carry - 10);carry = 1;}else {res.insert(res.begin(), ia[i] + carry);carry = 0;}}else if (i < 0 && j >= 0) {//只有b的情况 if (ib[j] + carry > '9') {//结果要插入到上一个结果的前面res.insert(res.begin(), ib[j] + carry - 10);carry = 1;}else {res.insert(res.begin(), ib[j] + carry);carry = 0;}}else { //只有进位res.insert(res.begin(), '1');carry = 0;}}}
​
​
int main() {string a;string b;char arr1[1024];char arr2[1024];while (scanf("%s%s", arr1, arr2) != EOF) {a = arr1;b = arr2;string ia = GetInteger(a);string ib = GetInteger(b);string fa = GetFraction(a);string fb = GetFraction(b);string fres;int carry;FractionPlus(fres, carry, fa, fb);string ires;IntegerPlus(ires, carry, ia, ib);string result = ires + '.' + fres;printf("%s\n", result.c_str());}return 0;
}

代码分析

以上代码有一些语法值得我们再次复习。

1.字符串操作

a.find('.');//找到字符串中第一次出现 . 的位置,返回下标。如果找不到,返回 string::npos
a.substr(0, pos)//从下标 0 开始,截取 pos 长度的子串

2.max() 是 C++ 标准库 <algorithm > 中的函数,用来返回两个值中的较大值。

知识点

将大写字母转为小写字母的方式

用tolower() 或者使用ASCII码

tolower() 是 C 标准库 里的函数

#include <cctype>
​
char lower = tolower('A'); // 结果是 'a'
​

在 ASCII 表中:

  • 大写字母 'A''Z' 的值是 65 ~ 90

  • 小写字母 'a''z' 的值是 97 ~ 122

  • 大小写之间的差值是 32

if (ch >= 'A' && ch <= 'Z') {ch += 32;
}

字符形式进行十进制运算的原理

现在我们想以字符形式进行十进制运算。

字符 '0' ~ '9' 在 ASCII 表中对应十进制数值 48~57。故 '3' + '6' = 51 + 54 = 105;在十进制运算中3 + 6 = 9;显然,9的ASCII码不是105,故我们不能简单的将两个字符相加来实现。那该怎么办?

==》因为字符和十进制数字的关系有字符 - '0' = 对应的十进制数字

如果你要对两个字符表示的数字相加(模拟竖式加法),你需要先把它们转换成数字再相加:

('3' - '0') + ('6' - '0') = 3 + 6 = 9

在上面的案例中,你可以看作 fa[i] - '0' 得到数字,fb[i] - '0' 得到数字,

然后数字相加,最后 + '0' 变回字符存进 res[i]

所以我们可以直接合并表示为fa[i] + fb[i] + carry - '0'

另外为什么可以与'9'表示,因为fa[i] + fb[i] + carry - '0' 这个结果是字符形式的,而在字符表示下:最大个位数字是 '9'(ASCII 57),如果 这个结果大于'9',也就对应了数字运算中的结果大于9,也就是竖式加法里的“要进位”条件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30026.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s概念及k8s集群部署(Centos7)

Centos7部署k8s集群 部署之前&#xff0c;先简单说下k8s是个啥&#xff1a; 一、k8s简介&#xff1a; k8s&#xff0c;全称&#xff1a;kubernetes&#xff0c;它可以看作是一个分布式系统支撑平台。k8s的作用&#xff1a; 1、故障自愈&#xff1a; k8s这个玩意可以监控容器…

牵引线标注:让地图信息更清晰的ArcGIS Pro技巧

在地图制作的世界里&#xff0c;标注的清晰度直接决定了地图的可读性和实用性。 今天&#xff0c;就让我们一同探索如何在ArcGIS Pro中巧妙地实现牵引线标注&#xff0c;为地图信息的呈现增添一份专业与清晰。 一、引言&#xff1a;牵引线标注的魅力 在地图制作中&#xff0…

VBA 数据库同一表的当前行与其他行的主键重复判断实现方案

目的&#xff0c;判断是否主键重复&#xff0c;不重复则登录新数据&#xff0c;重复则不登录。 定义类型&#xff1a; DataRecord   tableName 表名   rowNumber 行号   columnName 列名   data 数据 想要实现的代码逻辑如下&#xff1a; 模拟数据库的登录过程。假设…

Qt常用控件之树形QTreeWidget

树形QTreeWidget QTreeWidget 表示一个树形控件&#xff0c;里面的每一个元素&#xff0c;都是一个 QTreeWidgetItem 类型的对象&#xff0c;每个 QTreeWidgetItem 都可以包含多个文本和图标&#xff0c;每个文本或图标为一个列。 需要注意的是&#xff0c; QTreeWidget 向用…

java通用自研接口限流组件

某业务中需要对后端接口进行限流&#xff0c;我们可以直接引入阿里巴巴的Sentinel快速实现&#xff0c;但是某企业中出于安全考虑&#xff0c;需要部门自己研发一套&#xff0c;可以采用RedisLua脚本AOP反射自定义注解来实现 思路来源于链接 项目结构&#xff1a; 启动类&…

小程序事件系统 —— 33 事件传参 - data-*自定义数据

事件传参&#xff1a;在触发事件时&#xff0c;将一些数据作为参数传递给事件处理函数的过程&#xff0c;就是事件传参&#xff1b; 在微信小程序中&#xff0c;我们经常会在组件上添加一些自定义数据&#xff0c;然后在事件处理函数中获取这些自定义数据&#xff0c;从而完成…

【2025小黑课堂】计算机二级WPS精选系列20G内容(可下载:真题+预测卷+软件+选择题)

2025年3月全国计算机等级考试即将于3月29日至31日举行。为了帮助广大考生高效备考&#xff0c;小编特意收集并整理了最新版&#xff08;备考2025年3月&#xff09;的小黑课堂计算机二级WPS 电脑题库软件&#xff0c;助力考生在考试中游刃有余&#xff0c;轻松通关&#xff01; …

你会测量管道液体流阻吗?西-魏斯巴赫方程(Darcy-Weisbach Equation)、Colebrook-White 方程帮你

测量管道液体流阻需要测量以下关键量&#xff1a; 需要测量的量 压力差&#xff08;ΔP&#xff09;&#xff1a;管道入口和出口之间的压力差&#xff0c;通常通过压力传感器或差压计测量。流量&#xff08;Q&#xff09;&#xff1a;流经管道的液体体积流量&#xff0c;可通…

行为模式---中介者模式

概念 中介者模式是一种行为模式&#xff0c; 他的核心思想是通过引入一个中介者对象&#xff0c;将多个对象之间的复杂交互逻辑统一管理。每个对象只需要与中介者通信&#xff0c;而不需要直接与其他对象交互&#xff0c;从而降低系统的耦合度。 适用场景 对象之间交互复杂&…

可狱可囚的爬虫系列课程 18:成都在售新房数据爬虫(lxml 模块)实战

上一篇文章中带大家学习了 lxml 模块以及 XPath 语法&#xff0c;本文针对某网新房数据编写爬虫进行实战。 一、网页信息的获取 抓取地址&#xff1a;https://cd.fang.lianjia.com/loupan/ import requestsLink https://cd.fang.lianjia.com/loupan/ Headers {User-Agent: …

行为模式---迭代器模式

概念 迭代器模式是设计模式的行为模式&#xff0c;它的主要设计思想是提供一个可以操作聚合对象&#xff08;容器或者复杂数据类型&#xff09;表示&#xff08;迭代器类&#xff09;。通过迭代器类去访问操作聚合对象可以隐藏内部表示&#xff0c;也可以使客户端可以统一处理…

自定义组件渲染search框

1创建search分支 创建自定义组件 2.渲染my_search的基本结构 3.封装自定义属性和click事件 通过自定义属性增强组件的通用性 4.封装click事件 5.导航跳转 6.吸顶效果 7自动获得焦点与防抖效果 搜索页面搜索框基本结构 8实现搜索框自动获取焦点功能 9处理防抖效果

大语言模型学习--向量数据库基础知识

1.向量 向量是多维数据空间中的一个坐标点。 向量类型 图像向量 文本向量 语音向量 Embedding 非结构化数据转换为向量过程 通过深度学习训练&#xff0c;将真实世界离散数据&#xff0c;投影到高维数据空间上&#xff0c;通过数据在空间中间的距离体现真实世界的相似度 V…

JVM详解

目录 一.JVM的概念 1. 什么是JVM? 2.JVM用来干什么? 二JVM运行流程 JVM执⾏流程 2.1类加载机制 2.2类加载机制带来了哪些好处? 2.3类加载的过程是什么? 2.3.1加载 2.3.2验证 2.3.3准备阶段 2.3.4解析阶段 符号引⽤ 直接引⽤ 2.3.5初始化阶段 2.4类加载器 什么…

【JavaScript】08-作用域+箭头函数+解构赋值

本文以后的文章主要是介绍ES6语法。 目录 1.作用域 1.1 局部作用域 1.1.1 函数作用域 1.1.2 块作用域 1.2 全局作用域 1.3 作用域链 1.4 垃圾回收机制GC 1.4.1 内存生命周期 1.4.2 注意 1.4.3 内存泄漏 1.5 闭包 1.5.1 概念 1.5.2 闭包的作用 1.5.3 闭包应用 1.…

Mysql中的常用函数

1、datediff(date1,date2) date1减去date2&#xff0c;返回两个日期之间的天数。 SELECT DATEDIFF(2008-11-30,2008-11-29) AS DiffDate -- 返回1 SELECT DATEDIFF(2008-11-29,2008-11-30) AS DiffDate -- 返回-1 2、char_length(s) 返回字符串 s 的字符数 3、round(x,d)…

百度移动生态事业群聚焦UGC战略,贴吧迎新调整

易采游戏网3月8日独家消息&#xff1a;近日据内部消息人士透露&#xff0c;百度移动生态事业群正积极将用户生成内容&#xff08;UGC&#xff09;作为新的战略重点。此举标志着百度对UGC价值的重视与重塑&#xff0c;同时也预示着其旗下重要平台——百度贴吧将迎来一轮重大的调…

开源项目介绍:Native-LLM-for-Android

项目地址&#xff1a;Native-LLM-for-Android 创作活动时间&#xff1a;2025年 支持在 Android 设备上运行大型语言模型 &#xff08;LLM&#xff09; &#xff0c;具体支持的模型包括&#xff1a; DeepSeek-R1-Distill-Qwen: 1.5B Qwen2.5-Instruct: 0.5B, 1.5B Qwen2/2.5VL:…

STM32标准库代码详解之GPIO

GPIO的初始化代码如下&#xff1a; /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟&#xff0c;使用外设必须开启/*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量 GPIO_InitStructure.GPIO_Mode GPIO_Mo…

实现Django和Transformers 构建智能客服大模型(模拟订单系统)

一、环境安装准备 #git拉取 bert-base-chinese 文件#创建 虚拟运行环境python -m venv myicrplatenv#刷新source myicrplatenv/bin/activate#python Django 集成nacospip install nacos-sdk-python#安装 Djangopip3 install Django5.1#安装 pymysql settings.py 里面需要 # 强制…