HJ2 计算某字符出现次数

news2024/9/27 10:30:17

HJ2 计算某字符出现次数

  • 1 题目
  • 2 解法
    • 2.1 count_if 本题代码
      • 2.1.1 C++ STL非更易型算法--count_if介绍
      • 2.1.2 C++中cin(),cin.get(),cin.getline(),getline()总结:
    • 2.2 一般做法
  • 3 【扩展】C++ STL--非更易型算法


1 题目

题源链接

描述
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)

在这里插入图片描述


2 解法


2.1 count_if 本题代码

#include <algorithm>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s;
    getline(cin, s);
    char c = tolower(getchar());
    cout << count_if(s.begin(), s.end(), [c](char i) { return towlower(i) == c; }) << endl;
}

[c](char i) { return towlower(i) == c; }
是C++中的Lambda表达式:(也称为lambda函数)是在调用或作为函数参数传递的位置处定义匿名函数对象的便捷方法。通常,lambda用于封装传递给算法或异步方法的几行代码 。
Lambda表达式详解


2.1.1 C++ STL非更易型算法–count_if介绍

定义于头文件 < algorithm >

算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first, last) ,其中 last 指代要查询或修改的最后元素的后一个元素。(即前闭后开)

count_if 返回区间中满足指定条件的元素数目。
函数是自定义的,返回值是true就是表示符合要求。

template<class InputIterator, class Predicate>

   typename iterator_traits<InputIterator>::difference_type count_if(

      InputIterator _First,

      InputIterator _Last,

      Predicate _Pred

   );

_First 输入迭代器指向将被搜索的区间第一个元素的位置。

_Last 输入迭代器指向将被搜索的区间最后一个元素后面的。

_Pred用户自定义的 predicate function object ,定义了元素被计数需满足的条件。 predicate 只带一个参数,返回 true 或 false.

简单来说:
count_if (first,last,value,comp);
first为首迭代器,last为末迭代器,value为要查询的元素,comp为比较函数。

示例代码:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool IsOdd(int i) {
    return ((i % 2) == 1); 
}
int main() { // 找出[v.begin(), v.end())范围内奇数的个数
    int cnt;
    vector<int> v;
    for (int i = 1; i < 10; i++)
        v.push_back(i); // v: 1 2 3 4 5 6 7 8 9
    cnt = (int) count_if(v.begin(), v.end(), IsOdd);
    cout << "v contains " << cnt << " odd values.\n"; // v contains 5 odd values.
    return 0;
}

2.1.2 C++中cin(),cin.get(),cin.getline(),getline()总结:

  • cin的读取字符规则:
    cin遇到回车、空格、tab键 结束,但是缓冲区还存在这三个字符,并没有将这三个字符丢弃,且指针光标在这三个字符之前,也就是说,下一次通过其他输入函数读取时,是可以读到这三个字符的。

  • cin.get 的读取字符规则:

    1. cin.get(字符变量名) 可以用来接收字符:
char  ch;
ch = cin.get();
//cin.get(ch);
  1. cin.get(字符数组名,接收字符数目) 用来接收一行字符串,可以接收空格
//输入abcdfg
//输出abcd
char ch[10];
cin.get (ch, 5);
cout << ch << endl;//只接收4个字符,第5个的内容是'\0'
  1. cin.get(无参数): 没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车。
	string a;
	cin>>a;
	cout<<a<<endl;
	/*此时的第一个cin.get()获取的是cin中最后的'\n',也就是消除缓冲区的'\n'第二个的作用在于在程序结束时输入一个字符,
让程序停留在运行界面*/
	cin.get();
	cin.get();
	system("pause");

  • cin.getline() : 接受一个字符串,可以接收空格并输出 cin.getline()实际上有三个参数,当第三个参数省略时,系统默认为’\0’
#include <iostream>
using namespace std;
int main() 
{  
	char ch[5];
	cin.getline(ch, 5);
	//cin.getline(ch, 5,'s'); 
	//输入:asd
	//输出:a
	cout << ch << endl;
	system("pause");
	return 0;
}

  • getline() : 接受一个字符串,可以接收空格并输出,需包含 #include< string >丢弃换行符
	string s;
	getline(cin, s);
	cout << s << endl;
	//输入:I Love You
	//输出:I Love You
  • gets() : 接受一个字符串,可以接收空格并输出,需包含“#include< string >”
	string s;
	getline(cin, s);
	cout << s << endl;
	//输入:I Love You
	//输出:I Love You
  • cin.getline()、cin.get()的区别:
    cin.getline()与cin.get()都能接收输入的带有空格的字符串直到遇到换行符停止接收。
    但是二者稍有区别:
    cin.getline() 丢弃换行符,而cin.get() 将其保留在输入队列中。

2.2 一般做法

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s;
    getline(cin, s);

    char c = tolower(getchar());

    int n = 0;
    for (char i : s) {
        if (tolower(i) == c) {
            ++n;
        }
    }
    cout << n << endl;
}


3 【扩展】C++ STL–非更易型算法

adjacent_find
是 STL 算法组件中的算法,adjacent_find 的默认作用:搜查相邻重复的元素

函数原型:

  • adjacent_find(iterator beg, iterator end);
    // 用于查找范围内相等的相邻元素,并返回到这两个元素中第一个的迭代器,如果没有找到这样的对,则返回last的值
    // beg 开始迭代器
    // end 结束迭代器

实例:

#include <iostream>
#include <vector>
#include <algorithm>//algorithm头文件是必不可少的 

using namespace std;
int main() {
    //初始化一个vector类型的容器作为查找的对象 
    vector<int> vec;
    vec.push_back(5);
    vec.push_back(2);
    vec.push_back(2);
    vec.push_back(0);
    vec.push_back(0);
    //vec = {5, 2, 2, 0, 0} 

    //定义一个迭代器first(名称不固定,此处便于理解所以命名为first) 
    vector<int>::iterator first;
    //再定义一个迭代器last 
    vector<int>::iterator last;
    //两个迭代器分别对应查找区间的第一个位置和最后一个位置 

    vector<int>::iterator result;
    //定义一个迭代器result存储adjacent_find函数返回的结果 

    first = vec.begin();
    last = vec.end();
    //将first对应到容器的开头元素,将last对应到元素的末尾位置

    result = adjacent_find(first, last);
    //用result存储对整个容器搜索的结果
    //此条语句等价于:
    result = adjacent_find(vec.begin(), vec.end());

    cout << "对整个容器进行搜索的结果为:";

    if (result == last) { //如果搜索函数的返回值为搜索区间的末尾迭代器,即last,表明在搜索区间内不存在相等的相邻元素 
        cout << "Not find." << endl;
    } else { //否则表示存在 相等的相邻元素 
        cout << *result << endl;
        //输出result所对应的元素值,即相等的相邻元素中前一个元素的值 
        //因为vec = {5, 2, 2, 0, 0} 
        //所以最终的输出是2 (不是0,输出第一对相等的相邻元素) 
    }
    return 0;
}

count:返回目标元素在指定序列中出现了多少次

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main () {
    int mycount;
    // counting elements in array:
    int myints[] = {10,20,30,30,20,10,10,20};   // 8 elements
    mycount = (int) count (myints, myints+8, 10);
    cout << "10 appears " << mycount << " times.\n";
    // counting elements in container:
    vector<int> myvector (myints, myints+8);
    mycount = (int) count (myvector.begin(), myvector.end(), 20);
    cout << "20 appears " << mycount  << " times.\n";
    return 0;
    /* 【打印结果】
        10 appears 3 times.  // 数字10出现了3次
        20 appears 3 times.  // 数字20出现了3次
     */
}

By–Suki 2023/1/9

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HTTP】浏览器缓存(HTTP缓存)

文章目录一、强制缓存1.1、ExPires1.2、Cache-Control二、协商缓存2.1、last-modified2.2、etag浏览器缓存&#xff08;Browser Caching&#xff09;是为了节约网络的资源加速浏览&#xff0c;浏览器在用户磁盘上对最近请求过的文档进行存储&#xff0c;当访问者再次请求这个页…

在国内 PMP 有多少含金量?

PMP 证书已经在全球206个国家和地区得到认可&#xff0c;据 PMI 官方数据统计&#xff0c;截至2021&#xff0c;全球持有效 PMP 证书人数达110 W&#xff0c;国内占比28.98%&#xff0c;超33 W人次。 第一&#xff0c;PMP证书有什么价值&#xff1f; 01.PMP认证的重要性 PMP是…

Unreal UPROPERTY属性标记宏

BlueprintReadOnly,让该变量可在蓝图中访问。新建一个继承AActor的C类CustomActor,添加int变量TestProperty,并给他加上BlueprintReadOnly标记:这样,就能在蓝图中引用该变量。BlueprintReadWrite,让该变量可以在蓝图中使用以及修改。给TestProperty变量添加BlueprintReadWrite标…

【云原生进阶之容器】第二章Controller Manager原理2.7节--Indexer剖析

7 Indexer Indexer是client-go用来存储资源对象并自带索引功能的本地存储,Reflector从DeltaFIFO中将消费出来的资源对象存储至Indexer。Indexer中的数据与Etcd集群中的数据保持完全一致。client-go可以很方便地从本地存储中读取相应的资源对象数据,而无须每次都从远程Etcd集群…

复现yolov5CPP经验贴

源码&#xff1a; https://github.com/Hexmagic/ONNX-yolov5/blob/master/src/test.cpp 该源码亲测可行&#xff0c;但是还是有一些问题 此处改成False 此处改成自己转换好的onnx模型路径 用神经网络工具&#xff1a; https://github.com/lutzroeder/netron 用该工具可查看输入…

【UE4 第一人称射击游戏】24-添加人工智能的敌人跟随功能

上一篇&#xff1a;【UE4 第一人称射击游戏】23-添加子弹伤害本篇效果&#xff1a;步骤&#xff1a;将 导航网格体边界体积 拖入视口按P键显示区域将导航区域扩大一些如果不想让导航体覆盖上面的区域可以将导航体的高度降低一些打开“SimpleAI”&#xff0c;添加一个“Pawn感应…

Java Type

Type 是Java 编程语言中所有类型的公共高级接口&#xff08;官方解释&#xff09;&#xff0c;也就是Java 中所有类型的”爹“。其中”所有类型“的描述尤为指的关注。它并不是我们平常工作中经常使用的int、String、List、Map等数据类型&#xff0c;而是从Java语言角度磊说&am…

shell练习之安全脚本

题目&#xff1a; 将密码输入错误超过4次的IP地址通过firewalld防火墙阻止访问 1.初始配置 首先使用systemctl工具启用firewalld服务&#xff1a; ​[rootlocalhost ~]# systemctl enable firewalld如果已经启用了&#xff0c;我们现在可以通过执行以下命令启动firewalld&a…

失败就是差一点的成功,社科院与杜兰大学金融管理硕士项目为你在职读研助力

失败的人&#xff0c;只差了一点点&#xff1b;成功的人&#xff0c;是多做了一点点&#xff1b;顶尖的人&#xff0c;则是再多做一点点。小事成就大事&#xff0c;细节成就完美&#xff0c;所以&#xff0c;千万不要只差那么一点&#xff0c;就放弃了。都说失败是成功之母&…

从Reactor模式俯瞰Nginx,你会发现你与高手的差距就在设计模式上

我们知道了Nginx是做什么的以及它为何如此高效&#xff0c;以至于全宇宙拿它来做负载均衡或者说web server。 但是如果你只是了解了使用和知道了原理就认为已经掌握了它&#xff0c;那只能说你肤浅了&#xff0c;原理和使用技能看看大家都知道了&#xff0c;没必要拿出去和别人…

快排递归、迭代的实现和两种优化方法

目录 快速排序 实现代码 时间复杂度 快排的优化 随机选择策略 三位取中法 非递归的快排 快速排序 快速排序算法是基于分治策略的一个排序算法&#xff0c;其基本思想是对于输入的子数组进行分解、递归求解&#xff0c;最后合并。 分解&#xff1a;以数组中左边第一个数作…

运行flutter doctor命令检测环境是否配置成功报错及解决方案

/** 运行flutter doctor命令检测环境是否配置成功&#xff0c;报如下错误**/ 1. cmdline-tools component is missing & Android licenses status unknown 1.1.安装cmdline-tools 1.2.配置android-licenses 运行命令flutter doctor --android-licenses&#xff0c;提示…

封装一个帧动画组件,使用的是精灵图

我写的是淘宝小部件&#xff0c;限制很多&#xff0c;用的是精灵图&#xff0c;说下大概思路&#xff0c;主要是通过背景图片的X Y轴去控制&#xff0c;首先创建一个组件 例&#xff1a; 然后在props定义需要的参数&#xff0c;可通过父组件传递修改 需要传入精灵图地址、单…

【云原生】Prometheus监控docker容器

部署node-exporter用于搜集硬件和系统信息 // 全部主机都要做 docker run -d -p 9100:9100 -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --nethost prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-point…

Windows系统pagefile.sys删除、移动

背景 在使用windows系统中通常会发现c盘系统盘容量和实际容量不符。以至于你以为还有几十个G的空间&#xff0c;但操作程序时会出现空间不足的情况 。 例如以下错误&#xff1a; # There is insufficient memory for the Java Runtime Environment to continue. # Native memo…

【六】Netty Google Protobuf 编解码

Netty Google Protobuf 编解码Google Protobuf 介绍Protobuf 的入门Protobuf 开发环境搭建Protobuf 下载创建.proto文件第五节的 对应实体&#xff08;SubscribeReq&#xff0c;SubscribeResp &#xff09;SubscribeReq.proto 文件SubscribeResp.proto利用命令生成对应的java文…

详解c++---string模拟实现

这里写目录标题前言准备工作构造函数析构函数迭代器的实现插入数据有关的函数实现reservepush_backoperatorappendinserterasefindresize[ ]clear>>>>新式拷贝构造函数新式赋值重载前言 在前面的文章里我们学习了c中string的用法&#xff0c;那么这篇文章我们将带…

Vue的双向绑定(数据劫持)

双向绑定所谓的双向绑定其实就是&#xff0c;ui或者数据有一方做了修改&#xff0c;那么另外一个也会随着改变。简单来说&#xff0c;视图驱动数据&#xff0c;同时数据也能驱动视图。视图驱动数据&#xff0c;只需要绑定事件。数据驱动视图&#xff0c;则需要去对数据做监听&a…

DC-DC PCB layout经验-含走线宽度和载流量表格

在DC-DC芯片的应用设计中&#xff0c;PCB布板是否合理对于芯片能否表现出其最优性能有着至关重要的影响。不合理的PCB布板会造成芯片性能变差如线性度下降&#xff08;包括输入线性度以及输出线性度&#xff09;、带载能力下降、工作不稳定、EMI辐射增加、输出噪声增加等&#…

不同Nodejs版本的TypeScript的建议配置

Node Target Mapping microsoft/TypeScript Wiki GitHubTypeScript is a superset of JavaScript that compiles to clean JavaScript output. - Node Target Mapping microsoft/TypeScript Wikihttps://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping以上是tsc…