原题链接:蓝桥杯2018年第九届真题-交换次数
解题思路:
①首先统计ABT三个字母的次数
②ABT全排列有6种方式,调用cal(String s1, String s2, String s3, char c1, char c2, char c3)方法计算
③s1表示第一个字母长度的字符串,s2表示第二个字母长度的字符串,s3表示第三个字母长度的字符串
④c1、c2、c3表示字母的排列方式,如排列方式为BAT的话,则c1 = ‘B’, c2 = ‘A’, c3 = ‘T’
⑤cal():
1. 统计s1中字母的个数
2. 统计s2中字母的个数
3. 总需交换次数为s1.length()-s1(c1)+s2.length()-s2(c2)-Math.min(s2(c1),s1(c2))
第一字母交换次数+第二字母交换次数-第二字母刚好在第一字母长度内的个数与第一字母刚好在第二字母长度内的个数的最小值
4. 与结果比较,较小者优先
参考代码:
import java.util.HashMap; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String string = scanner.next(); HashMap stringmap = new HashMap(); /* * 测试用例长度 * while (string.length() < 100000) { string += string; } */ // 统计ABT三个字母的次数 for (int i = 0; i < string.length(); i++) { char charAt = string.charAt(i); if (stringmap.containsKey(charAt)) { stringmap.put(charAt, stringmap.get(charAt) + 1); } else { stringmap.put(charAt, 1); } } char[] carr = { 'A', 'B', 'T' }; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { for (int j2 = 0; j2 < 3; j2++) { if (i != j && i != j2 && j != j2) { // ABT全排列有6种方式 // s1表示第一个字母长度的字符串,s2表示第二个字母长度的字符串,s3表示第三个字母长度的字符串 // c1、c2、c3表示字母的排列方式,如排列方式为BAT的话,则c1 = 'B', c2 = 'A', c3 = 'T' String s1 = string.substring(0, stringmap.get(carr[i])); String s2 = string.substring(s1.length(), s1.length() + stringmap.get(carr[j])); cal(s1, s2, carr[i], carr[j], carr[j2]); } } } } System.out.println(result); } static int result = Integer.MAX_VALUE; private static void cal(String s1, String s2, char c1, char c2, char c3) { // 统计s1中字母的个数 HashMap map1 = new HashMap(); map1.put(c1, 0); map1.put(c2, 0); map1.put(c3, 0); for (int i = 0; i < s1.length(); i++) { char charAt = s1.charAt(i); map1.put(charAt, map1.get(charAt) + 1); } // 统计s2中字母的个数 HashMap map2 = new HashMap(); map2.put(c1, 0); map2.put(c2, 0); map2.put(c3, 0); for (int i = 0; i < s2.length(); i++) { char charAt = s2.charAt(i); map2.put(charAt, map2.get(charAt) + 1); } // 总需交换次数为s1.length()-s1(c1)+s2.length()-s2(c2)-Math.min(s2(c1),s1(c2)) // 第一字母交换次数+第二字母交换次数-第二字母刚好在第一字母长度内的个数与第一字母刚好在第二字母长度内的个数的最小值 int sum = s1.length() - map1.get(c1) + s2.length() - map2.get(c2) - Math.min(map1.get(c2), map2.get(c1)); result = Math.min(sum, result); } }
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复