2024华为OD试题及答案-A040-完美走位

题目描述

在第一人称射击游戏中,玩家通过键盘的A、S、D、W四个按键控制游戏人物分别向左、向后、向右、向前进行移动,从而完成走位。

假设玩家每按动一次键盘,游戏任务会向某个方向移动一步,如果玩家在操作一定次数的键盘并且各个方向的步数相同时,此时游戏任务必定会回到原点,则称此次走位为完美走位。

现给定玩家的走位(例如:ASDA),请通过更换其中一段连续走位的方式使得原走位能够变成一个完美走位。其中待更换的连续走位可以是相同长度的任何走位。

请返回待更换的连续走位的最小可能长度。

如果原走位本身是一个完美走位,则返回0。

输入描述

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

输出描述

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

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

解题思路分析

题目要求将玩家的走位调整成一个完美走位,完美走位定义为上下左右(WASD)各个方向的步数相同。我们需要找到待更换的连续走位的最小可能长度,使得原走位变成完美走位。

  1. 输入描述

    • 一行字符串表示的走位,例如:ASDA
  2. 输出描述

    • 一个整数,表示待更换的连续走位的最小可能长度,如果原走位本身是一个完美走位,则返回0

解题步骤:

  1. 统计各个方向的步数

    • 统计字符串中W, A, S, D各自的数量。
  2. 判断是否为完美走位

    • 如果W, A, S, D的数量相等,则直接返回0
  3. 滑动窗口查找最小更换长度

    • 使用滑动窗口技术在字符串中查找一个子串,使得通过更换这个子串可以使得原走位变成完美走位。
    • 计算所需的最小窗口长度。

C++程序实现

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

int findMinLength(string s) {
    unordered_map<char, int> count;
    for (char c : s) {
        count[c]++;
    }
    
    int n = s.length();
    int target = n / 4;
    
    if (count['W'] == target && count['A'] == target && count['S'] == target && count['D'] == target) {
        return 0;
    }
    
    int minLength = INT_MAX;
    int left = 0;
    
    for (int right = 0; right < n; ++right) {
        count[s[right]]--;
        
        while (count['W'] <= target && count['A'] <= target && count['S'] <= target && count['D'] <= target) {
            minLength = min(minLength, right - left + 1);
            count[s[left]]++;
            left++;
        }
    }
    
    return minLength;
}

int main() {
    string s;
    cin >> s;
    
    int result = findMinLength(s);
    cout << result << endl;
    
    return 0;
}

Python程序实现

 
def find_min_length(s):
    from collections import Counter
    
    count = Counter(s)
    n = len(s)
    target = n // 4
    
    if count['W'] == target and count['A'] == target and count['S'] == target and count['D'] == target:
        return 0
    
    min_length = float('inf')
    left = 0
    
    for right in range(n):
        count[s[right]] -= 1
        
        while count['W'] <= target and count['A'] <= target and count['S'] <= target and count['D'] <= target:
            min_length = min(min_length, right - left + 1)
            count[s[left]] += 1
            left += 1
    
    return min_length

# 输入
s = input().strip()

# 计算并输出结果
result = find_min_length(s)
print(result)

解释

上述代码通过统计各个方向的步数,并使用滑动窗口技术在字符串中查找一个子串,通过更换这个子串可以使得原走位变成完美走位。C++和Python实现的逻辑一致,分别通过调整窗口的左右边界来找到最小的更换长度。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值