今日头条2018校招编程题
题目描述
有一个仅包含’a’和’b’两种字符的字符串s,长度为n,每次操作可以把一个字符做一次转换(把一个’a’设置为’b’,或者把一个’b’置成’a’);但是操作的次数有上限m,问在有限的操作数范围内,能够得到最大连续的相同字符的子串的长度是多少。
输入描述:
第一行两个整数 n , m (1<=m<=n<=50000),第二行为长度为n且只包含’a’和’b’的字符串s。
输出描述:
输出在操作次数不超过 m 的情况下,能够得到的 最大连续 全’a’子串或全’b’子串的长度。
示例1
输入
8 1
aabaabaa
输出
5
说明
把第一个 'b' 或者第二个 'b' 置成 'a',可得到长度为 5 的全 'a' 子串。
我的方法:
#include<stdio.h>
#include<iostream>
#include<string>
#include<algorithm>using namespace std;int main() {int n, m;int j = 0, k = 0;int maxLen = 0;string s;cin >> n >> m;cin >> s;int astring[50000] = { 0 };int bstring[50000] = { 0 };for (int i = 0; i<n; i++) {if (s[i] == 'a')astring[j++] = i;elsebstring[k++] = i;}if (m >= j || m >= k) {cout << s.size() << endl;return 0;}if (m <= 0) {int j = 0;for (int i = 0; i < s.size(); i++) {maxLen = max(maxLen, i - j);while (s[j] != s[i])j++;}cout << maxLen << endl;return 0;}//首位处理,0<m<j,0<m<kint maxLen1 = max(astring[m], int(s.size() - astring[j - m-1]-1)); for (int i = 1; (i + m) < j; i++) {maxLen1 = max(astring[i + m] - astring[i - 1] - 1, maxLen1);}int maxLen2 = max(bstring[m], int(s.size() - bstring[k - m-1]-1));for (int i = 1; (i + m) < k; i++) {maxLen2 = max(bstring[i + m] - bstring[i - 1] - 1, maxLen2);}maxLen = max(maxLen1, maxLen2);cout << maxLen << endl;return 0;
}
方法二:
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>using namespace std;string str;
int n, m;int change_alpha(char k)
{vector<int> loc;for (int i = 0; i < n; ++i)if (str[i] == k) loc.push_back(i);loc.push_back(n);int max_length = loc[m];for (int i = m + 1; i < loc.size(); ++i) {// loc[i]当前k实际索引, loc[i-m-1] i的前面m个数翻转之后,再前面的未翻转k的索引// loc[i] - loc[i-m-1] - 1 之间翻转m个k之后,中间字符的长度。max_length = max(max_length, loc[i] - loc[i-m-1] - 1);}return max_length;
}int main()
{cin >> n >> m;cin >> str;cout << max(change_alpha('a'), change_alpha('b')) << endl;
今日头条2018校招编程题相关推荐
- 今日头条2017校招编程题
贪心?瞎搞 先排个序,然后扫一遍,边扫边维护一个数组v v的长度为3 设vs数组的最后一个是x 如果abs(a[i]-x)大于10 那么贪心的策略我就 添加个v+10相应的ans++. ...
- 今日头条2018校招测试开发方向(第一、二、三、四批)编程题汇总 - 题解
对于今日头条这家公司来说,测试的题和后端开发的题几乎是一样的,但是由于第一批的后端开发的题没有在牛客网上放出来,因此,猜测后端开发第一批的题应该和后端开发第一批的题一样,同时也想做一个测试方向编程题的 ...
- 今日头条2018校招测试开发方向(第一批)详解
##问答题 #####1.给定一棵树的根节点, 在已知该树最大深度的情况下, 求节点数最多的那一层并返回具体的层数. ######如果最后答案有多层, 输出最浅的那一层,树的深度不会超过100000. ...
- 京东校招java面试题_京东2018校招编程题解答(Java)
写在前面 本文主要是解答这次校招中京东的笔试编程题,这次京东的笔试编程题比较难,涉及KMP算法.manacher算法等.文中的解法也是在观看了左神(左程云)9月20号在牛客网的直播后,自己花时间写出来 ...
- 今日头条2018校招后端方向(用户喜好)c++
题目描述: 为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用 ...
- 今日头条2018校招后端方向(第二批)
1.为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号 ...
- 拼多多2018校招编程题
[编程题] 最大乘积 给定一个无序数组,包含正数.负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1) 输入描述: 无序整数数组A[n] 输出描述: 满足 ...
- 今日头条2018校招大数据/算法方向(第一批)详解
问答题 1.给定一棵树的根节点, 在已知该树最大深度的情况下, 求节点数最多的那一层并返回具体的层数. 如果最后答案有多层, 输出最浅的那一层,树的深度不会超过100000.实现代码如下,请指出代码中 ...
- 今日头条2018校招后端方向(第二批)编程题2,串珠问题。java代码。
作为一个手串艺人,有金主向你订购了一条包含n个杂色串珠的手串--每个串珠要么无色,要么涂了若干种颜色.为了使手串的色彩看起来不那么单调,金主要求,手串上的任意一种颜色(不包含无色),在任意连续的m个串 ...
最新文章
- CentOS6.4+rabbitmq集群——源码安装
- 带你开发类似 Pokemon Go 的 AR 游戏
- Zabbix如何实现Server和Agent的通信加密
- 通过Nginx简单安装
- modelsim显示状态机名称的方法
- 房费制 它 结账BUG
- JPA+Hibernate 3.3 ——第一个JPA程序
- MySQL数据表查询操作
- ios签名php在线监控,IOS无需签名无需越狱H5网页在线封装APP教程
- 炉石兄弟 修复图腾师问题 by大神beebee102, 还有阴燃电鳗
- 浏览器页面前端自适应方案
- 每天叫醒的不是闹钟而是励志文章梦想
- 【MT19937】学习分析
- Fatal error: Cannot use 'Object' as class name as it is reserved in xxx/Object.php on line 77
- 计算机点击应用时总是跳到顶端,电脑总是跳出当前应用程序
- HTML中常见的选择器 的优先级
- python-office的使用
- Fiddler 抓包下载 M3U8 视频
- 中年人学C语言Windows程序设计,30 DialogBox控件
- 西安西北大学计算机排名,全国计算机排名真是这样吗?