题目分析
这里的意思是一共n个值每k个一组循环,最少改变多少个值就能让循环相同
思路分析
我在这里首先想的是二维数组方便观察循环,依据题目即为每一竖列比较,哪一个值出现的最少那么那就是需要更改的次数,(此题在这儿不考虑需要更改多类值,例[1,2][1,2][2,2][3,2],即每一竖列最多有两种值),再把每一数列需要更改的次数加起来即为答案
代码
import java.util.*;import java.io.IOException;public class Main {public static void main(String[] args) throws IOException {Scanner sc =new Scanner(System.in);int n= sc.nextInt();//获取nint k= sc.nextInt();//获取ksc.nextLine();//吞回车int[][] arr=new int[n/k][k];//二维数组,由于k个一组所以实际只有n/k行int re=0;//初始化答案for (int j=0;j<n/k;j++){for (int i = 0; i < k; i++) {arr[j][i]= sc.nextInt();//遍历存入二维数组}}for (int j=0;j<k;j++) {//每一列比较HashMap<Integer,Integer> count=new HashMap<>();//每一列比较时都初始化哈希表,键为出现的数字,值为次数count.put(arr[0][j],1);//初始化第一个作为比较,但是实际这一步可以省略,只需要i从0开始即可for (int i = 1; i < n/k; i++) {//遍历该列的每一行count.merge(arr[i][j],1, Integer::sum);//利用merge函数,如果arr不在哈希表中就存入并值为1,如果在就值+1}if (count.size()==1){//如果哈希表只有一个键说明不需要改动continue;//直接跳过后面操作,继续下一列操作}int mix=Integer.MAX_VALUE;//初始哈最小值,但这个值要足够大才能被更新for (Map.Entry<Integer,Integer> entry:count.entrySet()) {//利用foreach遍历哈希表int temp=entry.getValue();//每一个键对应的值if (temp<mix){//比较最小值,可以得出该列最少需要更新次数mix=temp;//更新最小值}}re+=mix;//每一列的最小值计入答案}System.out.println(re);}
}
回顾
这道题在考虑的时候略显复杂,此处也学习到了merge函数,比每次用containsKey判断键是否存在再replace函数更新要方便很多。
感谢您能够看到这里,一起见证小何同学的算法学习,如果您有不同的见解,希望能得到您的指点和点悟;如果您是和我一样的同学,也希望这篇文章能对您有所帮助。