58同城秋招笔试题解答 --map模式按value进行排序
求字符串中字母重叠的次数并按要求输出(笔试题)
题目描述:
给定一个字符串,求出字母重叠出现的次数,最后按字典格式输出。
输入示例:
aaabccbbbfffaddbaa
输出示例:
a : 5
b : 3
f : 3
c : 2
d : 2
解释:例如a-5,因为只计算aaa+aa,单个字母非重叠所以不计入结果
解题思路:
看到按字典格式输出条件反射性的要用到map,但是再次看输出示例,我有点懵了。这输出示例中呈现着怎样的字典格式呢??
内心OS:题目中abcdf输入出现的顺序是a,b,c,f,d,如果用map直接统计并输出那么理应是a,b,c,d,f(map特点-用key进行升序排列),但是输出示例中的的顺序却是a,b,f,c,d。
于是我又认真审题后发现,原来题目中的输出是按重叠的次数进行降序输出的。所以我们直接用map进行解题其结果必然不能通过。
因此解题的思路有以下两个可以参考:
- 用map统计后再用value进行倒序排列
- 先将重叠出现的字母都放在unordered_map<char,int>m中,再根据unordered_map中的value值进行排序,最后依次输出
难点在于:怎么根据map中的value值进行排序?
用value排序的主要思想是将map中的pair转存到vector中,再自己写一个比较函数 cmp,用< algorithm>中的sort(v.begin(),v.end(),cmp)对vector进行自己定义方法的排序,就可以完成根据value值对map排序。
具体实现如下:
vector <pair<char, int>> vt;//1. 将map中数据构建成pair依次转存到vector中for (auto it = m.begin(); it != m.end(); it++) vt.push_back(make_pair(it->first, it->second));//2. 下面使用sort对vector进行自定义排序,cmp函数用C++11中的lambda表达式替换sort(vt.begin(), vt.end(), [](const pair<char, int> &x, const pair<char, int> &y)->int{return x.second > y.second; }); //3. 用迭代器遍历并将pair值按指定格式依次输出for (auto it = vt.begin(); it != vt.end(); it++)cout << it->first << ":" << it->second << endl;
完整解题代码
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;void Rep(string s, unordered_map<char, int>& m)
{string ret; //ret用于存放重叠的字母ret.push_back(s[0]);for (size_t i = 1; i<s.size(); i++){if (s[i] == ret[0]) //如果重叠要计入ret.push_back(s[i]);else{ if (ret.size()>1) //当前不重叠但ret中有重叠{for (auto &e : ret) //将ret中重叠字母依次放入map中m[e]++;}ret.clear(); //清空retret.push_back(s[i]); //将当前字母放在ret中}}if (ret.size()>1) //原字符串遍历完,ret中仍有重叠的字符串{for (auto &e : ret) //继续移入map中m[e]++;}
}
int main()
{string s;cin >> s;unordered_map <char, int> um;Rep(s, um); //计算重叠字母,并放在map中//将map中数据按value排序vector <pair<char, int>> vt;for (auto it = um.begin(); it != um.end(); it++) vt.push_back(make_pair(it->first, it->second));sort(vt.begin(), vt.end(), [](const pair<char, int> &x, const pair<char, int> &y)->int{return x.second > y.second; });//按要求格式输出for (auto it = vt.begin(); it != vt.end(); it++)cout << it->first << ":" << it->second << endl;cout << endl;system("pause");return 0;
}
58同城另一编程题:求以字母d或e结尾的单词的个数
58同城秋招笔试题解答 --map模式按value进行排序相关推荐
- 凑硬币(58同城2017校招笔试题)
凑硬币(58同城2017校招笔试题) 暴力破解,循环递归实现,代码如下: /** * 暴力破解,循环递归,找出了所有可能的组合并进行了存储,* 在循环递归的时候,因为选取的分类相互是有重叠的,生成的递 ...
- 字节跳动-2020秋招-笔试题剖析【5道算法题】
字节跳动-2020秋招-笔试题剖析[5道算法题],限时120分钟. 让我们一起来看看这些题吧! 题一:模型文件去重 [题目描述] 抖音上不同的用户类型我们有不同的用户模型文件. 我们有一个模型配置文件 ...
- 2020大疆秋招笔试题B卷
2020大疆秋招笔试题B卷 选择题(选项没抄下来)10道记了9道 1.关于常指针和指向常量的指针 2.多线程调用如下函数,a,b,c哪些需要加锁保护 int a = 0; void knit() {s ...
- 2021网易秋招笔试题(Android开发)
网易笔试题(2021.08.08) 校招的笔试题通常是4道编程题,时间为2个小时,每题25分. 2021秋招笔试题总结如下,包含问题和代码实现. 题1:查找关键词 查找关键词(单词在文章中出现频率&g ...
- 腾讯 2015秋招笔试题 编程题2:九宫格填数
腾讯 2015秋招笔试题 编程2:九宫格填数 题目 2: 有下图的题解,请用 C/C++ 代码来列出满足下图 0-100 内的所有答案. 配合加减乘除,使得九宫格横竖都等于4. 智力冲浪 数字推理 请 ...
- 酷狗java秋招笔试题
酷狗java秋招笔试题 单选题 1.在命中率极高的缓存设计中,时间复杂度最差的数据结构是( B ). A. 数组 B. 链表 C. 树 D. 哈希表 2.某二叉树共有11个结点,其叶子结点只有2个.则 ...
- 字节跳动2020届秋招笔试题
字节跳动2020届秋招第一批笔试题(2019.8.11) 文章目录 字节跳动2020届秋招第一批笔试题(`2019.8.11`) 第一题[编程题25分]: 闹钟叫醒去上课 第二题[编程题25分]: 秘 ...
- 2017酷家乐秋招笔试题——后台开发
楼主,昨天晚上做了酷家乐的笔试题,本来发来说是19:00-21:00两个小时,结果登入考试系统发现倒计时只有一个小时(坑!).不过题量很少,主要是选择题和简答题,简答题有一道是要编程的,当时内心太慌没 ...
- 嵌入式软件工程师 秋招笔试题
某半导体公司的笔试题,当时花在C语言上的时间太少,答得很不好,现在有时间就分析一下错题吧. 1.存储一个32位数0x12345678到0x1000H-0x1003H四个字节单元中,若以小端模式存储,则 ...
最新文章
- flume高可用-balance-配置文件编写
- (搬家文) c++引用深入探讨
- asp.net如何取得纯客户端控件的值
- java处理请求的流程_Java Spring mvc请求处理流程详解
- Python实例讲解 -- 认识wxpython 的 Frame
- window git安装 以及 tortoiseGit安装与使用
- mongoDB Error:not master and slaveOk=false
- 控制器(下) -运维笔记
- 大数据开发基础入门与项目实战(一)Java SE之4.方法和封装
- ReactNative运用插件react-native-amap-geolocation获取Android手机高德经纬度
- Docker容器获取宿主机信息
- 三维GIS与游戏引擎的跨界融合,打造数字化孪生的平行世界
- 华为p4不是鸿蒙吗怎么又改为安卓_华为已将“基于安卓10”变成“兼容安卓10”,EMUI就是鸿蒙OS...
- Ti437x LED裸机程序全解
- Arduino ESP8266/ESP32读取和改写MAC
- 网闸标底--网神G6150-C022
- MATLAB基于Randon变换的图像倾斜校正算法及实现
- 面试数据分析师岗位要注意的几点
- monkeyrunner的使用
- 史上最全的Uboot常用命令汇总(超全面!超详细!)收藏这一篇就够了