完美走位

题目描述

在第一人称射击游戏中,玩家通过键盘的A、S、D、W四个按键控制游戏人物分别向左、向后、向右、向前进行移动,从而完成走位。
假设玩家每按动一次键盘,游戏任务会向某个方向移动一步,如果玩家在操作一定次数的键盘并且各个方向的步数相同时,此时游戏任务必定会回到原点,则称此次走位为完美走位。
现给定玩家的走位(例如:ASDA),请通过更换其中一段连续走位的方式使得原走位能够变成一个完美走位。其中待更换的连续走位可以是相同长度的任何走位。
请返回待更换的连续走位的最小可能长度。
如果原走位本身是一个完美走位,则返回0。

输入描述

输入为由键盘字母表示的走位s,例如:ASDA

输出描述

输出为待更换的连续走位的最小可能长度。

用例

输入 WASDAASD
输出 1
说明 将第二个A替换为W,即可得到完美走位
输入 AAAA
输出 3
说明 将其中三个连续的A替换为WSD,即可得到完美走位

源码和解析
解析:

先匹配出多的字符及个数 那个字符次数-平均值为多余的。即需要在原字符串中找出一个子串,该子串满足多余出来的字符和出现的字数。 如A多了2次 S多了一次 那么查找的子串可以为ASA AAS SSAA等。最后返回的结果是那个最短子串的长度。
使用双指针来解决这个问题。不断地判断两个指针之间的字符串是否满足条件。若满足条件,左指针右移到右指针那个位置,继续寻找下一个子串。最后再将字符串反向来查找一次。就基本能满足大多数测试用例了。

示例代码:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class T26 {public static void main(String[] args) {String input = "WASDAASDSDAS";char[] chArr = input.toCharArray();char C[] = { 'W', 'A', 'S', 'D' };Map<Character, Integer> chCountMap = new HashMap<Character, Integer>();for (char c : C) {chCountMap.put(c, 0);}// 统计每个字符出现的次数for (char c : chArr) {chCountMap.put(c, chCountMap.get(c) + 1);}int avgLen = input.length() / 4;// 计算每个字符的差值for (char c : C) {chCountMap.put(c, chCountMap.get(c) - avgLen);}// 计算每个字符正和负的情况 其实就是统计正出现的个数即可for (char c : C) {int count = chCountMap.get(c);if (count <= 0)chCountMap.remove(c); // 移除负数次数的}int min = count(input, chCountMap);int reverseMin = count(new StringBuilder(input).reverse().toString(),chCountMap);if (min < reverseMin) {System.out.println(min);} else {System.out.println(reverseMin);}}// 统计双指针找满足条件的最小子串长度public static int count(String input, Map<Character, Integer> chCountMap) {int start = 0; // 开始索引int end = 1;// 结束索引int min = Integer.MAX_VALUE;String word;while (end < input.length()) {word = input.substring(start, end);if (!chCountMap.containsKey(word.charAt(0))) {// 首字母不是 干掉start++;end++;continue;}if (check(word, chCountMap)) {start = end;if (word.length() < min) {min = word.length();}end++;} else {end++;}}return min;}// 统计 字符串中是否有满足map中字符出现个数的public static boolean check(String word, Map<Character, Integer> wordMap) {char[] chArr = word.toCharArray();Map<Character, Integer> cMap = new HashMap<>();for (char c : chArr) {if (cMap.containsKey(c)) {cMap.put(c, cMap.get(c) + 1);} else {cMap.put(c, 1);}}Set<Character> keySet = wordMap.keySet();boolean flag = true;for (Character key : keySet) {if (!cMap.containsKey(key))return false;if (wordMap.get(key) > cMap.get(key))return false;}if (flag)return true;return false;}
}

代码测试结果

输入WASDAASDSDAS

输入AAAA

华为OD机试之完美走位(Java源码)相关推荐

  1. 华为OD机试 - 获得完美走位(Python)| 真题+思路+代码

    最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 [2023] 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python ...

  2. 华为OD机试 - 获得完美走位(C 语言解题)【独家】

    最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单 华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典 [华为OD机试]全流程解析+经验分享,题型分 ...

  3. 华为OD机试 -获得完美走位(Java) | 机试题+算法思路+考点+代码解析 【2023】

    获得完美走位 题目 在第一人称射击游戏中,玩家通过键盘的A.S.D.W四个按键控制游戏人物分别向左.向后.向右.向前进行移动,从而完成走位. 假设玩家每按动一次键盘,游戏人物会向某个方向移动一步,如果 ...

  4. 【华为OD机试真题2023 JAVA】不含101的数

    华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 不含101的数 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 小明在学习二进制时,发现了一类不含101的数,也就是: ...

  5. 【华为OD机试真题2023 JAVA】硬件产品销售方案

    华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 硬件产品销售方案 知识点递归数组DFS搜索回溯 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 某公司目前推出了AI开发 ...

  6. 【华为OD机试真题2023 JAVA】网上商城优惠活动(一)

    华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 网上商城优惠活动(一) 时间限制:1s 空间限制:50MB 限定语言:不限 题目描述: [背景] 某网上商城举办优惠活动,发布了满减.打折 ...

  7. 【华为OD机试真题2023 JAVA】字母组合

    华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 字母组合 知识点回溯 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 每个数字对应多个字母,对应关系如下: 0:a,b, ...

  8. 【满分】【华为OD机试真题2023 JAVA】 打印文件

    华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 打印文件 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 有5台打印机打印文件,每台打印机有自己的待打印队列.因为打印的 ...

  9. 【华为OD机试真题2023 JAVA】几何平均值最大子数组

    华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 几何平均值最大子数组 知识点数组二分查找 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 从一个长度为N的正数数组num ...

最新文章

  1. 恶搞c语言程序设计,C语言编程学习:让人绝望的C语言恶搞小程序(二)
  2. 安装kube-prometheus项目:k8s部署prometheus、监控k8s核心组件、添加告警(微信、钉钉、企业微信)、进行数据持久化
  3. 关于exchange2003使用owa修改用户口令
  4. 通过Xcode断点集成 reveal(2017-10-20更新)
  5. 工程师、产品经理、数据工程师是如何一起工作的?
  6. android 按键上浮动画_android – 浮动动作按钮动画
  7. traceroute命令原理
  8. jQuery插件开发代码
  9. java中文乱码转换编程_java中文乱码如何转换
  10. CMMI3-CMMI5认证费用及认证周期
  11. eclipse各版本对应JDK版本要求
  12. win10 Network Location Awareness 错误:1068依赖服务或组无法启动
  13. JavaEE | 增强for循环
  14. mybatis(二)xml配置文件详细说明
  15. 关节空间阻抗控制器设计的个人理解
  16. iOS Keychain(钥匙串)原理及使用
  17. 测绘用计算机吗,测绘工程中计算机制图应用
  18. 第一节课的Python基础知识
  19. 电磁中间继电器DZJ-206/220VAC
  20. host文件的详解与修改方式

热门文章

  1. 力扣让我心碎的第二天
  2. 因此你认为不必对全世界喊话。 心理妙招”
  3. 拆解康耐特光学赴港上市:业绩增速有所放缓,持续增长能力存疑
  4. Spring Boot+Vue+ElementUI实现文件的上传和下载到本地 并将 文件信息存入数据库
  5. 离散基础 (1). 从“访存模型”看“切比雪夫定理”
  6. 四元数完全解析及资料汇总
  7. 11条让你人间清醒的职场箴言
  8. Linux系统目录介绍
  9. 图基础知识:色调、色饱和度、色相
  10. Python-将一个英文文本文件中的大写字母变成小写字母,小写字母变成大写字母