21/02/19刷题记录Day2

36. 有效的数独

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

思路

1.考虑用hashmap。行,列,宫格各一个。
2.单独用行举例,有9行,每行有9个数,外层hashmap:表达不同行,内层hashmap:同一行的不同数。
3.宫格与位置关系:s = i / 3 * 3 + j / 3

语法

char转换成int:

方法1:
char x = '6';
int ans = x - '0';
方法2: 
char x = '6';
int ans =  Integer.parseInt(String.valueof(x));

在这个题中,可以直接将char的ascii码转换成数字。

错误

在条件判断的时候,应当先考虑到不存在的时候添加,所有条件共同成立才添加

完整代码

HashMap<Integer, HashMap<Integer, Integer>> rMap = new HashMap<Integer, HashMap<Integer,Integer>>();
		HashMap<Integer, HashMap<Integer, Integer>> cMap = new HashMap<Integer, HashMap<Integer,Integer>>();
		HashMap<Integer, HashMap<Integer, Integer>> sMap = new HashMap<Integer, HashMap<Integer,Integer>>();
		
		for(int i = 0; i < board.length; i++) {
			rMap.put(i, new HashMap<Integer, Integer>());
			cMap.put(i, new HashMap<Integer, Integer>());
			sMap.put(i, new HashMap<Integer, Integer>());
		}
		
		for(int i = 0; i < board.length; i++) {
			for(int j = 0; j < board[0].length; j++) {	
				if(board[i][j] == '.') {
					continue;
				}
				int x = (int)board[i][j];
				int s = i / 3 * 3 + j / 3;
				if(!rMap.get(i).containsKey(x) && !cMap.get(j).containsKey(x) && !sMap.get(s).containsKey(x)) {
					rMap.get(i).put(x, 1);
					cMap.get(j).put(x, 1);
					sMap.get(s).put(x, 1);
				}else {
					return false;
				}
			}
		}
		return true;

    }

在这里插入图片描述

697. 数组的度

给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。

你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。

思路

1.频数可以用hashmap来记录
2.hashmap的value用数组表示
3.记录下每个数出现的第一个位置和最后一个位置

错误

1.在hashmap中,传入的value是数组,但是这里的数组不能一次性修改

hashMap.put(nums[i], {hashMap.get(nums[i])[0]++, hashMap.get(nums[i])[1], hashMap.get(nums[i])[2] = 1} );

这样无法通过编译,正确的修改如下:

hashMap.get(nums[i])[0]++;
hashMap.get(nums[i])[2] = i;

其中value数组的三个数分别表示:频次,初始位置,最终位置
2.迭代时

语法

因为在遍历过程中使用到了key和value,所以需要使用下面的遍历:


Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
	System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue())
}

如果只是使用key,或者value:

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
 
//iterating over keys only
for (Integer key : map.keySet()) {
	System.out.println("Key = " + key);
}
 
//iterating over values only
for (Integer value : map.values()) {
	System.out.println("Value = " + value);
}

使用迭代器

Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
	Map.Entry<Integer, Integer> entry = entries.next();
	System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

完整代码

HashMap<Integer, int[]> hashMap = new HashMap<Integer, int[]>();
		
		for(int i = 0; i < nums.length; i++) {
			if(!hashMap.containsKey(nums[i])) {
				hashMap.put(nums[i], new int[] {1, i, i});
			}else {
				hashMap.get(nums[i])[0]++;
				hashMap.get(nums[i])[2] = i;
			}
		}
		
		int maxShow = 0;
		int minDist = 0;
		
		for(Integer e : hashMap.keySet()) {
			int dist = hashMap.get(e)[2] - hashMap.get(e)[1] + 1;
			if(hashMap.get(e)[0] > maxShow) {
				maxShow = hashMap.get(e)[0];
				minDist = dist;
			}else if(hashMap.get(e)[0] < maxShow){
				continue;
			}else {
				minDist = Math.min(dist, minDist);
			}
		}
		return minDist;

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42180334/article/details/113863554