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;