总结
总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。
如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《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点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。
bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**