这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战
范围求和II
该题出自力扣的598题——范围求和II,自己做的题解
审题
给定一个初始元素全部为 0,大小为 m*n 的矩阵 M 以及在 M 上的一系列更新操作。
操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义是将所有符合 0 <= i < a 以及 0 <= j < b 的元素 Mi 的值都增加 1。
在执行给定的一系列操作后,你需要返回矩阵中含有最大整数的元素个数
-
简单概括就是,给一个M * N 的矩阵,有一个二维数组,二维数组内的0位和1位,决定了矩阵的范围+1
-
思路:
- 不要拘泥于暴力的做法,+1只是个幌子
- 矩阵内,每次遍历二维数组都是一个范围——长 * 宽
- 在这个基础上,只需要找出最短的长,和最短的宽即可
- 有意思的是,不要用最小面积去作为对比,会导致部分结果的长款用例更小,结果错误
编码
- 需要校验数组条件,如果数组条件为空,则直接返回m * n 的矩阵
public int maxCount(int m, int n, int[][] ops) {
if (ops.length == 0){
return m* n;
}
int mina = m ;
int minb = n;
for (int[] a:ops){
mina = Math.min(a[0],mina);
minb= Math.min(a[1],minb);
}
return mina * minb;
}
猜数字游戏
该题出自力扣的299题——猜数字游戏(中等题),消化于官方题解
审题
你在和朋友一起玩 猜数字(Bulls and Cows)游戏,该游戏规则如下:
写出一个秘密数字,并请朋友猜这个数字是多少。朋友每猜测一次,你就会给他一个包含下述信息的提示:
猜测数字中有多少位属于数字和确切位置都猜对了(称为 "Bulls", 公牛), 有多少位属于数字猜对了但是位置不对(称为 "Cows", 奶牛)。也就是说,这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。 给你一个秘密数字 secret 和朋友猜测的数字 guess ,请你返回对朋友这次猜测的提示。
提示的格式为 "xAyB" ,x 是公牛个数, y 是奶牛个数,A 表示公牛,B 表示奶牛。
请注意秘密数字和朋友猜测的数字都可能含有重复数字。
- 简单概括就是,给出两个字符串(数字),找出两个数,一个是位置一样+数字一样,一个是位置不一样
- 第一个完全一致的数很简单,遍历即可获得
- 主要是第二个,数字一样,位置不一致,需要用两个数组存储相应的出现次数
- 再遍历,获得最少出现的即可
编码
public String getHint(String secret, String guess) {
int a = 0;
int b = 0;
int[] cow1 = new int[10];
int[] cow2 = new int[10];
for (int i = 0;i<secret.length();i++){
if (secret.charAt(i) == guess.charAt(i)){
a++;
}else {
++cow1[secret.charAt(i) - '0'];
++cow2[guess.charAt(i) - '0'];
}
}
for (int i = 0;i<10;++i){
b += Math.min(cow1[i],cow2[i]);
}
StringBuilder sb = new StringBuilder();
sb.append(a);
sb.append("A");
sb.append(b);
sb.append("B");
return sb.toString();
}