CF 371A.K-Periodic Array(Java实现)

CF 371A.K-Periodic Array(Java实现)_第1张图片

题目分析

        这里的意思是一共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();//获取n
		int k= sc.nextInt();//获取k
		sc.nextLine();//吞回车
		int[][] arr=new int[n/k][k];//二维数组,由于k个一组所以实际只有n/k行
		int re=0;//初始化答案
		for (int j=0;j 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 entry:
					count.entrySet()) {//利用foreach遍历哈希表
				int temp=entry.getValue();//每一个键对应的值
				if (temp

回顾

        这道题在考虑的时候略显复杂,此处也学习到了merge函数,比每次用containsKey判断键是否存在再replace函数更新要方便很多。

         感谢您能够看到这里,一起见证小何同学的算法学习,如果您有不同的见解,希望能得到您的指点和点悟;如果您是和我一样的同学,也希望这篇文章能对您有所帮助。

你可能感兴趣的:(java,开发语言)