题目描述:

【编码题】字符串S由小写字母构成,长度为n。定义一种操作,每次都可以挑选字符串中任意的两个相邻字母进行交换。询问在至多交换m次之后,字符串中最多有多少个连续的位置上的字母相同?

输入描述:

第一行为一个字符串S与一个非负整数m。(1 <= |S| <= 1000, 1 <= m <= 1000000)

输出描述:

一个非负整数,表示操作之后,连续最长的相同字母数量。

输入

abcbaa 2

输出

2

说明

使2个字母a连续出现,至少需要3次操作。即把第1个位置上的a移动到第4个位置。
所以在至多操作2次的情况下,最多只能使2个b或2个a连续出现。

解题思路:

交换其实就是左右一步一步移动的意思,要求在 m 步内获得最长的连续字母;所以我们一开始就要知道每个字母究竟位于字符串的哪个位置。

可以将字符串 s 的 26 个字母下标记录下来,同个字母多个下标就会变成一个数组,那么就像下面这样

a - [1, 5, 6]

b - [2, 4]

c - [3]

这是不是让你想起了散列表呢,我们接下来就可以用 HashMap <Character, List> 存放上面的数据。

现在我们拿到 a 字母的位置信息,如果要使得 a 连续,那么必然要先找出一个中心 ctr,将所有的 a 都向这个中心移动。而且离中心较远的点,我们不会将它移动到离中心较近的点前面,否则将不能满足最小步数的条件(假如只移动较远的点而不移动较近的点的话)。

于是我们就得到了各点向中心点移动的步数 move[] 数组;最后只要将 move[] 数组升序排序,按照贪心策略可以得到当前最大的连续点数目。 如下图过程@

public static void solv(String s, int m){Map<Character, List> map = new HashMap<>(26);for (int i = 0; i < s.length(); i++){char c = s.charAt(i);List list = map.get(c);if (list == null)map.put(c, list = new ArrayList<Integer>(100));list.add(i);}int maxLen = 1;for (Map.Entry<Character, List> entry : map.entrySet()){List<Integer> arrayList = entry.getValue();for (int i = 0; i < arrayList.size(); i++){int ctr = arrayList.get(i);int []move = new int[arrayList.size()];// 获取 move[],表示每个相同字母到中心点 ctr 需要移动的最少步数for (int j = 0; j < arrayList.size(); j++)move[j] = (Math.abs(arrayList.get(j) - ctr) -Math.abs(i - j));// 排序后,选择移动代价最少的前 k + 1 个Arrays.sort(move);int sum = 0;for (int k = 0; k < move.length; k++){sum += move[k];if (sum > m)break;if (k + 1 > maxLen)maxLen = k + 1;}}}System.out.println(maxLen);}

今日头条2018校园招聘后端开发工程师 (第二批) 编程题 - 字母交换相关推荐

  1. 今日头条2018校园招聘后端开发工程师(第二批)编程题 - 题解

    以前做过第三批的题目,今日头条2018校园招聘后端开发工程师(第三批)编程题 - 题解.这一场的题目偏技巧和算法,而第三批的题偏编码.这一场涉及的算法有二分查找.区间动态规划. 原题链接:点这儿. 第 ...

  2. 今日头条2018校园招聘后端开发工程师(第二批)编程题 (Java版)

    本人技术小白一枚,文章只是记录个人的解题思路和过程 牛客网地址:原题链接 第一题:用户喜好 题目 为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时 ...

  3. 今日头条2018校园招聘后端开发工程师(第四批)编程题 - 题解

    做过第三批的题目,今日头条2018校园招聘后端开发工程师(第三批)编程题 - 题解和第二批的题目,今日头条2018校园招聘后端开发工程师(第二批)编程题 - 题解. 这一场题目还是挺好玩的,也挺有技巧 ...

  4. 今日头条2018校园招聘后端开发工程师(第三批)编程题 - 题解

    昨天做了下头条的后端开发工程师的编程题,这编码量大啊,两个小时,三个编程题,一个改错题,一个设计题,说实话,很考技术含量,而且编程题中有两个还特别考细心编码,如果两个小时能做三个题,确实非常不错了,写 ...

  5. 手串(暴力) - 今日头条2018校园招聘后端方向(9.10)

    时间限制:1秒 空间限制:65536K 题目描述 作为一个手串艺人,有金主向你订购了一条包含n个杂色串珠的手串--每个串珠要么无色,要么涂了若干种颜色.为了使手串的色彩看起来不那么单调,金主要求,手串 ...

  6. 七牛2018春季校园招聘后端开发工程师笔试经验

    笔试公司:上海七牛信息技术有限公司 笔试岗位:后端开发工程师 笔试时间:2018年4月14日14:00-15:30 笔试形式:牛客网在线做题 笔试回忆: 笔试共分为不定项选择和问答两部分,不定项选择1 ...

  7. 今日头条2018校园招聘第一题 ---POJ 2479

    第一次参加公司的招聘笔试,虽然只是抱着试试水的心态去参加的,可惜的是第一题就做错了..... 第一题,其实只是一个求最大子段和的变式题,不过笔试的时候也不知道怎么了,就是不知道思路,最后还写了一个错的 ...

  8. 今日头条2018校园招聘第一次笔试第二题“字符串拼接”题解(一维动态规划及递归解法)

    3.24晚的笔试,结束后题目看不到了,有人截图了,来源:https://www.jianshu.com/p/00d3fd1d9e23 最新更新:在leetcode 上有一道类似的题,区别在于第一种操作 ...

  9. 【求职】 网易 2018 校园招聘 Java 开发工程师(BJ)笔试卷

    文章目录 一.单选题 二.编程题 一.单选题 1.以下哪些方法或场景不会导致 java 线程阻塞?( ) A. 调用wait() 方法 B. 系统IO 阻塞 C. 调用notify()方法 D. 调用 ...

最新文章

  1. sqli-lab_基础篇_1-23做题反思
  2. UTF-8和BOM的一些说明
  3. python通过下载链接下载_Python根据URL地址下载文件——wget
  4. android html邮件 messagecompose,android email 转发附件丢失问题
  5. cursor用法java,Cursor的基本使用方法
  6. LeetCode MySQL 1667. 修复表中的名字
  7. component、 filters(过滤器)、computed(计算属性)、$watch(观察属性)、设定计算属性
  8. Spring+Mybatis+Mysql搭建分布式数据库访问框架
  9. Python微博评论进行情感分析
  10. 如何用阿里云服务器建立个人网站
  11. 路由器RIP简单配置和讲解
  12. 查看电脑已连接过的账号密码
  13. Java中数组的定义和使用
  14. 点石互动--kyw之:30步,网站信任度提升200%
  15. MATLAB进行不定积分和定积分的求解
  16. CNC插补技术(从原理、分类到具体插补算法,较为详细)
  17. C#串口通信数据丢失解决方案
  18. Obsidian_常用三方插件
  19. 骑行用什么蓝牙耳机好?骑行骨传导耳机推荐
  20. 老电脑安装Windows11完整记录

热门文章

  1. ui设计和平面设计区别:ui设计前景怎样
  2. 采集练习(六) python获得chrome扩展 微度新标签页 下的云壁纸
  3. 云计算时代 自动化运维的开源云技术
  4. win7计算机显示空白,win7系统“打开或关闭windows功能”显示一片空白的解决方法...
  5. html5编写商品购买网页,HTML5 弹出式窗口的商品购买页卡片模板
  6. 比较全面的freemarker语法总结
  7. 剑指 Offer(C++版本)系列:总目录和一些提高效率的说明
  8. Vue父子组件及mixins生命周期执行顺序
  9. python处理excel代码_python处理Excel文件
  10. 工具.国内开源电子表格-Luckysheet(在线excel)