华为OD机试真题 完美走位 JavaScript java python c++ 参考解题

2023-11-15

题目描述

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

输入描述

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

输出描述

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

备注

  1. 走位长度 1≤s.length≤10^5
  2. s.length 是 4 的倍数
  3. s 中只含有 ASDW 四种字符

示例一

输入

ASDW

输出

0

说明

已经是完美走位了。

示例二

输入

AASW

输出

1

说明

需要把一个A更换成D,这样可以得到ADSW或者DASW

示例三

输入

AAAA

输出

3

说明

可以替换后 3 个 A,得到ASDW

js 

function perfectWalk(s) {
  const n = s.length;
  const cnt = { A: 0, S: 0, D: 0, W: 0 };
  for (let i = 0; i < n; i++) {
    cnt[s[i]]++;
  }
  const avg = n / 4;
  if (cnt.A === avg && cnt.S === avg && cnt.D === avg && cnt.W === avg) {
    return 0; // 已经是完美走位了
  }
  let ans = n; // 默认为走位的长度
  for (let len = 1; len <= n / 4; len++) {
    for (let i = 0; i + len <= n; i++) {
      if ((i + len) % avg !== 0) {
        continue; // 长度不为平均值的倍数,不是合法的替换方案
      }
      const cnt2 = { A: 0, S: 0, D: 0, W: 0 };
      for (let j = i; j < i + len; j++) {
        cnt2[s[j]]++;
      }
      if (cnt2.A === cnt2.S && cnt2.A === cnt2.D && cnt2.A === cnt2.W) {
        ans = Math.min(ans, len);
      }
    }
  }
  return ans - avg; // 最小可能长度为 ans - avg
}

python 

def perfectWalk(s):
    n = len(s)
    cnt = {'A': 0, 'S': 0, 'D': 0, 'W': 0}
    for i in range(n):
        cnt[s[i]] += 1
    avg = n // 4
    if cnt['A'] == avg and cnt['S'] == avg and cnt['D'] == avg and cnt['W'] == avg:
        return 0  # 已经是完美走位了
    ans = n  # 默认为走位的长度
    for length in range(1, n // 4 + 1):
        for i in range(n - length + 1):
            if (i + length) % avg != 0:
                continue  # 长度不为平均值的倍数,不是合法的替换方案
            cnt2 = {'A': 0, 'S': 0, 'D': 0, 'W': 0}
            for j in range(i, i + length):
                cnt2[s[j]] += 1
            if cnt2['A'] == cnt2['S'] == cnt2['D'] == cnt2['W']:
                ans = min(ans, length)
    return ans - avg  # 最小可能长度为 ans - avg

java

public static int perfectWalk(String s) {
    int n = s.length();
    Map<Character, Integer> cnt = new HashMap<>();
    cnt.put('A', 0);
    cnt.put('S', 0);
    cnt.put('D', 0);
    cnt.put('W', 0);
    for (int i = 0; i < n; i++) {
        char c = s.charAt(i);
        cnt.put(c, cnt.get(c) + 1);
    }
    int avg = n / 4;
    if (cnt.get('A') == avg && cnt.get('S') == avg && cnt.get('D') == avg && cnt.get('W') == avg) {
        return 0; // 已经是完美走位了
    }
    int ans = n; // 默认为走位的长度
    for (int len = 1; len <= n / 4; len++) {
        for (int i = 0; i + len <= n; i++) {
            if ((i + len) % avg != 0) {
                continue; // 长度不为平均值的倍数,不是合法的替换方案
            }
            Map<Character, Integer> cnt2 = new HashMap<>();
            cnt2.put('A', 0);
            cnt2.put('S', 0);
            cnt2.put('D', 0);
            cnt2.put('W', 0);
            for (int j = i; j < i + len; j++) {
                char c = s.charAt(j);
                cnt2.put(c, cnt2.get(c) + 1);
            }
            if (cnt2.get('A') == cnt2.get('S') && cnt2.get('A') == cnt2.get('D') && cnt2.get('A') == cnt2.get('W')) {
                ans = Math.min(ans, len);
            }
        }
    }
    return ans - avg; // 最小可能长度为 ans - avg
}

 c++

#include <string>
#include <unordered_map>
using namespace std;

int perfectWalk(string s) {
    int n = s.length();
    unordered_map<char, int> cnt;
    cnt['A'] = 0;
    cnt['S'] = 0;
    cnt['D'] = 0;
    cnt['W'] = 0;
    for (int i = 0; i < n; i++) {
        cnt[s[i]]++;
    }
    int avg = n / 4;
    if (cnt['A'] == avg && cnt['S'] == avg && cnt['D'] == avg && cnt['W'] == avg) {
        return 0; // 已经是完美走位了
    }
    int ans = n; // 默认为走位的长度
    for (int len = 1; len <= n / 4; len++) {
        for (int i = 0; i + len <= n; i++) {
            if ((i + len) % avg != 0) {
                continue; // 长度不为平均值的倍数,不是合法的替换方案
            }
            unordered_map<char, int> cnt2;
            cnt2['A'] = 0;
            cnt2['S'] = 0;
            cnt2['D'] = 0;
            cnt2['W'] = 0;
            for (int j = i; j < i + len; j++) {
                cnt2[s[j]]++;
            }
            if (cnt2['A'] == cnt2['S'] && cnt2['A'] == cnt2['D'] && cnt2['A'] == cnt2['W']) {
                ans = min(ans, len);
            }
        }
    }
    return ans - avg; // 最小可能长度为 ans - avg
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

华为OD机试真题 完美走位 JavaScript java python c++ 参考解题 的相关文章

  • Redux 状态在 mapStateToProps 中未定义

    我目前正在关注this http teropa info blog 2015 09 10 full stack redux tutorial html教程 我遇到了一些障碍mapStateToProps在下面的代码中 import Reac
  • 主干关系事件未触发?

    class TheModel extends Backbone RelationalModel relations type Backbone HasMany key subModels relatedModel SubModel coll
  • 在 Web 浏览器中查找触发 then 事件的 jQuery 代码

    我加入了一个团队来从事一个项目 现在他们使用 jQuery 并且很多 javascript 文件都是外部文件而不是嵌入的 当我点击一个按钮时 它看起来就像 a class button cancel Cancel a 它触发一个在一个 ja
  • 使用selenium IDE提取部分文本并将其放入变量中

    有人可以告诉我应该使用哪个命令来使用 Selenium Ide 从文本中仅提取数字 694575 并将其放入变量中以供进一步使用 这是带有文本的 div div class loginBoxTitle Edit Exhibition Cen
  • 限制文本区域中每行的字符数

    我整个周末都在寻找解决这个难题的方法 但尚未找到一个可以正常工作的解决方案 我想要实现的是限制文本区域中每行的字符数 不是相同地限制它们 而是我选择的每行不同的字符数 例如 我只想在我的文本区域中包含 4 行 第 1 2 和 3 行将限制为
  • 使用 Javascript 在 Imacros 中循环

    我如何使用 javascript 循环 imm imacros 脚本 我搜索了一下 发现了这个 for i 0 i lt n i iimPlay marconame iim 但当我使用它时 我的浏览器 Firefox 18 挂起 for i
  • 如何通过 HTML 按钮播放声音

    我目前通过网站播放音乐的方法是通过 HTML 音频标签 不过我希望能够通过 HTML 按钮来播放它 该按钮应该能够在播放和停止之间切换音乐 我在 JSFiddle 创建了一个示例 但不知道如何实现它 有人可以告诉我如何使用我的 JSFidd
  • 将一个文本框的内容复制到另一个文本框

    假设在文本框中输入了一个条目 是否可以在第二个文本框中保留相同的输入文本 如果是这样 这是如何完成的
  • Flask wtf.quick_form 运行一些 javascript 并设置表单变量

    我正在创建博客文章 到目前为止已经使用普通的 html 表单完成了 我所做的一个有趣的想法是运行 javascript onclick 并使用页面中的额外数据在表单中设置一个隐藏变量 这很好地传递到服务器并通过 request form 获
  • 使用模态表单 ajax 超出 HTMLFormElement.toString 的最大调用堆栈大小

    我想使用模态窗口中的 ajax 请求提交表单 单击此链接可打开该模式 a class btn btn primary i class fa fa edit i Write a review a 模态窗口 div class modal fa
  • 使react-leaflet能够离线使用

    我一直在使用反应传单 https github com PaulLeCam react leaflet图书馆 到目前为止运作良好 现在我希望网站预加载尽可能多的图块 以便网络应用程序 也是 PWA 可以在没有互联网的情况下使用 我找到了一些
  • AJAX:检查字符串是否为 JSON?

    我的 JavaScript 有时会在这一行崩溃 var json eval this responseText 当争论时会导致崩溃eval 不是 JSON 在进行此调用之前有什么方法可以检查字符串是否为 JSON 我不想使用框架 有什么方法
  • 用数组反向查找对象

    假设我有一个这样的对象 resourceMap a 0 1 2 3 4 5 6 7 8 9 10 b 11 12 c 21 23 d 54 55 56 57 510 确定是否的最佳方法是什么resourceId 21将会 c 我们不知道钥匙
  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • 如何清除WebGL中的矩形区域?

    WebGL 有一个clear清除整个表面的方法 清除表面的特定矩形的最佳方法是什么 例如 我想将一个从 50 50 开始的 100x100 像素框设置为全零 ARGB 0 0 0 0 我现在能想到的就是用一个写入零的片段着色器绘制一个四边形
  • 如何访问另一个 mobx 商店中的 mobx 商店?

    假设以下结构 stores RouterStore js UserStore js index js each of Store jsfiles 是一个 mobx 存储类 包含 observable and action index js只
  • React无限滚动scrollableTarget动态获取id?

    我在我的项目中使用react infinite scroll component 如何让scrollableTarget动态获取item id 我试过这样scrollableTarget item id 但它不起作用 必须与该 div 具有
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • 替换两个引号之间的字符串

    我想转动一根绳子str hello my name is michael what s your s into hello my name is span class name michael span 我怎样才能在 JavaScript
  • Bootstrap 3 / 显示模式不适用于 javascript 方式

    我用Modal http getbootstrap com javascript modalsBootstrap 3 0 的功能 我有这个代码 a href myNestedContent Open the modal containing

随机推荐

  • 《Vision-Language Pre-Training with Triple Contrastive Learning》/《具有三重对比学习的视觉语言预训练》

    一 摘要 视觉语言表示学习很大程度上受益于通过对比损失 例如 InfoNCE损失 的图像 文本对齐 这种对齐策略能够最大化图像与其匹配文本之间的互信息 MI 然而 简单地执行跨模态对齐 CMA 不能确保来自相同模态的相似输入保持接近 这可能
  • Greenplum元数据信息

    1 元数据重要的表 pg database 所有的数据库信息 pg namespace 所有的schema信息 pg class 所有的表信息 pg attribute 所有的属性信息 pg proc 函数信息 包括自定义函数 以上都可以以
  • spec文件说明

    spec文件概述 spec文件中主要包含4个class Analysis PYZ EXE和COLLECT Analysis以py文件为输入 它会分析py文件的依赖模块 并生成相应的信息 修改的主要是这个部分 PYZ是一个 pyz的压缩包 包
  • #循循渐进学51单片机#定时器与数码管#not.4

    1 熟练掌握单片机定时器的原理和应用方法 1 时钟周期 单片机时序中的最小单位 具体计算的方法就是时钟源分之一 2 机器周期 我们的单片机完成一个操作的最短时间 3 定时器 打开定时器 储存寄存器 的值经过一个机器周期自动加一 也就是说 机
  • 常用文件读写&CSV文件读写&对象的序列化和反序列化

    前言 意识 python中一切皆是对象 常见文件的读写分类 1 普通文本文件 txt py md html doc等 2 二进制文件 图片 音频 视频 压缩包等 3 csv文件 csv 需要借助于系统模块csv 4 对象的序列化和反序列化
  • 使用 sCrypt 实现数独游戏合约

    我们在 BSV 区块链上实现了一个数独游戏智能合约 利用之前介绍过的一种合约范式可以将游戏中寻找解题方案的过程外包上链 因为求解数独问题的计算工作量会随着其行列数快速增长 实际上它也是一个 NP 完全 问题 不过我们可以借由 sCrypt
  • 概率论中伯努利分布(bernoulli distribution)介绍及C++11中std::bernoulli_distribution的使用

    Bernoulli分布 Bernoulli distribution 是单个二值随机变量的分布 它由单个参数 0 1 给出了随机变量等于1的概率 它具有如下的一些性质 P x 1 P x 0 1 P x x x 1 1 x Ex x Var
  • ad如何设置pcb板子形状_AD18软件的PCB制作步骤

    作为一名电子工程师 我们将设计转化为实物的时候 一定会经历的步骤就是就是制作pcb 现在使用较多的都是Altium公司推出的一款AD软件 本人使用的就是这款AD18 当然也有使用Protel99SE软件的 我身边有的工作者还在使用这款软件
  • 合并排序(归并排序)

    合并排序 大致思想便是先将数组中的元素拆分成若干小部分 然后再将这些小部分按照顺序进行重新组合 从而实现排序 很明显 这里用到了分治法的思想 即将一个大问题分成若干个相同的小问题 因为问题规模变小了 所以解决问题的难度也随之减小 试想一下
  • 用户留存的计算

    用户留存的计算 基本是老生常谈了 可是这么多年下来 关于留存的计算 真的是差异太大了 最初版 将每个用户的所有交易月份用group concat 函数进行连接 把对应的结果导出到excel中 然后再用countifs来进行计算 这个方法大概
  • shell脚本中嵌入二进制文件

    最近有人问我 一个集群监控软件的安装文件特别 诡异 说脚本里有 乱码 却能执行 是怎么回事 我看了才发现这个东西原来是典型的脚本嵌套代码的模式 这里就讲讲吧 反正好久没写东西了 某些比较 拽 的单位在发布Linux软件时以一种特殊的形式发布
  • jdbc工作原理

    JDBC是Java数据库连接技术的简称 提供连接各种常用数据库的能力 一 JDBC API 提供者 sun公司 内容 供程序员调用的接口与类 集成在java sql和javax sql包中 如 DriverManager类 Connecti
  • Conditional GAN

    Conditional GAN CGAN 条件GAN 是 Mehdi Mirza 于2014年11月份发表的一篇文章 也是 GAN 系列的早期经典模型之一 是目前许多GAN应用的前身 文章的想法是 希望 可以控制 GAN 生成的图片 而不是
  • 五年软件测试人员,碰到这样的面试题居然心虚...

    我要跳槽 都说金三银四涨薪季 我是着急忙慌的准备简历 5年软件测试经验 可独立测试大型产品项目 熟悉项目测试流程 薪资要求 5年测试经验起码能要个20K吧 我加班肝了一页半简历 投出去一周 面试电话倒是不少 自信满满去面试 现场被问了这么几
  • 腾讯云免费SSL证书申请流程_每年免费50个HTTPS证书

    2023腾讯云免费SSL证书申请流程 一个腾讯云账号可以申请50张免费SSL证书 免费SSL证书为DV证书 仅支持单一域名 申请腾讯云免费SSL证书3分钟即可申请成功 免费SSL证书品牌为TrustAsia亚洲诚信 腾讯云百科分享腾讯云免费
  • [每天一个cmake技巧]cmake开启多核编译

    开启多核编译 可以加快编译速度 大大提升编译效率 具体操作如下 cmake build target all j12 加上 j12即可或者电脑性能足够好 j16
  • 软件(自动化)测试面试基础知识点汇总

    为什么要做接口测试 接口的由来 连接前后端以及移动端 因为不同端的工作进度不一样 所以需要对开始出来的接口进行接口测试 做接口测试的好处 1 节约时间 缩短项目成本 2 提高工作效率 3 提高系统的健壮性 你在项目中如何做接口测试 首先 当
  • 总结——C语言操作符

    总结 C语言操作符 一 算术操作符 算术标识符 加法运算符 加法运算符 加法运算符 加法运算符 加法运算符 只能用于整型 二 移位操作符 移位操作符有两种 gt gt 右移操作符 lt lt 左移操作符 右移操作时分为两种情况 算术右移 逻
  • [leetcode] 827. 最大人工岛

    class Solution private int size 507 507 int fa 507 507 void init for int i 0 i lt n m i fa i i size i 1 int find int x i
  • 华为OD机试真题 完美走位 JavaScript java python c++ 参考解题

    题目描述 在第一人称射击游戏中 玩家通过键盘的A S D W四个按键控制游戏人物分别向左 向后 向右 向前进行移动 从而完成走位 假设玩家每按动一次键盘 游戏人物会向某个方向移动一步 如果玩家在操作一定次数的键盘并且各个方向的步数相同时 此