2024年华为OD机试之完美走位(Java源码)_完美走位java(1),绝对干货分享

总结

总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。

如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

输入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;
	}
}


代码测试结果

最后

面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?

掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值