官方数据错误,不完整的循环节也输出了答案,例如 abcde 当 k 取 3 的时候,可以修改为 abc,这是不符合题意的。
如果非要过官方数据,修改代码 -1 输出的条件为 length < k,且将字符串长度截断为abc
以下解题先不考虑错误数据
解题思路:
1、首先判断能否将字符串整分,即判断s.length() 能否整除k,可以的话,再继续往下走,否则返回答案-1
2、既然可以整分,那就手动分开吧,创建一个二维数组,该数组每行k个元素,共s.length()/k行,其实也可以不使用二维数组,直接对字符串进行操作,但使用二维数组更直观一些。
3、统计每列中各字符出现的个数,然后把字符都修改成出现频率最高的那个字符,并统计修改次数(这里我是用HashMap来统计的)
例如:2 aabbaa
a | a |
b | b |
a | a |
第二列中,a出现的次数最多,需要把所有字符都改为a,需要改动一次
共改动2次,输出2即可
参考代码:
注意:这个代码通不过官方的检测,但实际是对的,因为官方数据有错误!下边也会给出能通过官方检测的代码
import java.util.*; public class Main { public static int result; public static void main(String[] args) { Scanner scan = new Scanner(System.in); int k = scan.nextInt(); String s = scan.next(); if (s.length() % k != 0) { result = -1; } else { int len = s.length() / k; char[][] target = new char[k][len]; for (int i = 0; i < k; i++) { for (int j = 0; j < len; j++) { target[i][j] = s.charAt(i * len + j); } } for (int i = 0; i < len; i++) { //统计每列中字符出现的次数 Map<Character, Integer> statistics = new HashMap<Character, Integer>(); for (int j = 0; j < k; j++) { char ch = target[j][i]; if (statistics.containsKey(ch)) { int count = statistics.get(ch); count = count + 1; statistics.put(ch, count); } else { statistics.put(ch, 1); } } //计算将将该列中的字符都改为该列出现次数最多的字符需要改动几次,并添加到result中 int max = 0; for (Character ch : statistics.keySet()) { int temp = statistics.get(ch); if (temp > max) { max = temp; } } result += k - max; } } System.out.print(result); scan.close(); } }
修改后的代码:
import java.util.*; public class Main { public static int result; public static void main(String[] args) { Scanner scan=new Scanner(System.in); int k=scan.nextInt(); String s=scan.next(); if(s.length()<k){ result=-1; }else{ int length=s.length()-s.length()%k; int len=length/k; char[][] target=new char[k][len]; for (int i = 0; i < k; i++) { for (int j = 0; j < len; j++) { target[i][j]=s.charAt(i*len+j); } } for (int i = 0; i < len; i++) { //统计每列中字符出现的次数 Map<Character,Integer> statistics= new HashMap<Character, Integer>(); for (int j = 0; j < k; j++) { char ch=target[j][i]; if(statistics.containsKey(ch)){ int count=statistics.get(ch); count=count+1; statistics.put(ch,count); }else{ statistics.put(ch,1); } } //计算将将该列中的字符都改为该列出现次数最多的字符需要改动几次,并添加到result中 int max=0; for (Character ch: statistics.keySet() ) { int temp=statistics.get(ch); if(temp>max){ max=temp; } } result+=k-max; } } System.out.print(result); scan.close(); } }
0.0分
11 人评分
C语言程序设计教程(第三版)课后习题8.9 (C语言代码)浏览:597 |
Tom数 (C++代码)浏览:868 |
简单的a+b (C语言代码)浏览:583 |
C语言训练-素数问题 (C语言代码)浏览:1695 |
【亲和数】 (C语言代码)浏览:588 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:613 |
【蟠桃记】 (C语言代码)浏览:697 |
C语言程序设计教程(第三版)课后习题8.7 (C语言代码)浏览:934 |
C语言程序设计教程(第三版)课后习题5.5 (C语言代码)浏览:582 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:826 |