目录
前言:
算法的题目需要时间去沉淀。当我们有了一定的刷题量,思路就会开阔很多,年轻人加油吧🤞
一、门牌制作
解析:
遍历1到2020,求每个数字中间有多少个2,然后累加即可。
代码实现
-
public
class
Test10 {
-
public
static
void
main
(String[] args) {
-
int
count
=
0;
-
for (
int
i
=
1; i <=
2020; i++) {
-
int
tmp
= i;
-
while (tmp !=
0) {
-
if (tmp %
10 ==
2) {
-
count++;
-
}
-
tmp /=
10;
-
}
-
}
-
System.out.println(count);
-
}
-
}
答案:624
二、寻找2020
解析:
由于这个需要读取文件,这里只有题目,直接谈思路。遍历这个矩阵,分别判断每个数据的行,列,左上到右下的斜线(只判读四个数据)。如果符合要求计数即可。
注意:我们在判断时,数据不能够越界。所以需要加上先决条件。
代码实现
-
public
class
Test11 {
-
public
static
void
main
(String[] args) {
-
int[][] arr = {{
2,
2,
0,
0,
0,
0},{
0,
0,
0,
0,
0,
0},{
0,
0,
2,
2,
0,
2},{
0,
0,
0,
0,
0,
0},{
0,
0,
0,
0,
2,
2},{
0,
0,
2,
0,
2,
0}};
-
int
row
= arr.length;
-
int
col
= arr[
0].length;
-
int
count
=
0;
-
for(
int
i
=
0; i < row; i++) {
-
for(
int
j
=
0; j < col; j++) {
-
//行
-
if(j +
3 < col && arr[i][j] ==
2 && arr[i][j +
1] ==
0 && arr[i][j +
2] ==
2 && arr[i][j +
3] ==
0) {
-
count++;
-
}
-
//列
-
if(i +
3 < row && arr[i][j] ==
2 && arr[i +
1][j] ==
0 && arr[i +
2][j] ==
2 && arr[i +
3][j] ==
0) {
-
count++;
-
}
-
//对角
-
if(i +
3 < row && j +
3 < col && arr[i][j] ==
2 && arr[i +
1][j +
1] ==
0 && arr[i +
2][j +
2] ==
2 && arr[i +
3][j +
3] ==
0) {
-
count++;
-
}
-
-
}
-
}
-
System.out.println(count);
-
}
-
}
三、蛇形填数
解析:
观察数据可发现,数据是以如下规律连续递增的。
已经得到数据的增长趋势,接下来只需要观察它们下标的规律,就可以填这些数。
可以很清楚的观察到。除了第一行,第二行横坐标在增长,纵坐标在减小。第三行横坐标在减小,纵坐标在增加,以此交替出现。减小的坐标直到减小到0,这行才会停止。下面的行减小的坐标是上一行增加的坐标加1,增加的坐标也是从0开始。
用i和j分别代表横纵坐标,第一行用[i--][j++]特殊处理。处理完成后i不符合第二行开始的坐标,j符合。(每一行开始0是交替出现)修正i,然后判断,开始第二行数据的添加。当第二行添加完成后,i符合第三行的开始坐标,j不符合。这个也是交替出现的。
代码实现(有详细注释)
-
public
class
Test12 {
-
public
static
void
main
(String[] args) {
-
//规律:每一行开头不是j为0就是i为0
-
int[][] arr =
new
int[
100][
100];
-
int
tmp
=
1;
-
int
i
=
0;
-
int
j
=
0;
-
for(
int
k
=
0; k <=
90; k++) {
-
if(i ==
0 && j ==
0) {
-
arr[i--][j++] = tmp++;
//结果j符合,i小1(两者交替出现)
-
}
else
if(++i ==
0) {
//修正i后在判断
-
int
ret
= k;
-
while((ret +
1) !=
0) {
-
arr[i++][j--] = tmp++;
-
ret--;
-
}
-
}
else
if(++j ==
0) {
//修正j后再判断
-
int
ret
= k;
-
//上面i会经过判断,需修正
-
i--;
-
while((ret +
1) !=
0) {
-
arr[i--][j++] = tmp++;
-
ret--;
-
}
-
}
-
}
-
System.out.println(arr[
19][
19]);
-
}
-
}
答案:761
四、成绩分析
解析:
这道题比较简单,最后需要格式化输出平均分。
注意:格式化输出就会进行四舍五入。
代码实现
-
import java.util.Scanner;
-
public
class
Test3 {
-
public
static
void
main
(String[] args) {
-
Scanner
scanner
=
new
Scanner(System.in);
-
int
n
= scanner.nextInt();
-
int[] arr =
new
int[n];
-
int
i
=
0;
-
for(i =
0; i < n; i++) {
-
arr[i] = scanner.nextInt();
-
}
-
int
max
= arr[
0];
-
int
min
= arr[
0];
-
int
sum
=
0;
-
for(i =
0; i < n; i++) {
-
if(arr[i] > max) {
-
max = arr[i];
-
}
-
if(arr[i] < min) {
-
min = arr[i];
-
}
-
sum += arr[i];
-
}
-
System.out.println(max);
-
System.out.println(min);
-
double
tmp
= sum *
1.0 / n;
-
//格式化就是四舍五入
-
System.out.printf(
"%.2f", tmp);
-
}
-
}
五、单词分析
解析:
用一个计数数组,遍历字符串。统计每个字符出现的次数。在统计次数的时候,每个字符是作为下标去统计的,字典序小的字符就会在数组的前面。遍历计数数组,找出出现次数最多的字符即可。
代码实现
-
import java.util.Scanner;
-
public
class
Test16 {
-
public
static
void
main
(String[] args) {
-
Scanner
scan
=
new
Scanner(System.in);
-
String
str
= scan.nextLine();
-
int[] arr =
new
int[
26];
-
for(
int
i
=
0; i < str.length(); i++) {
-
char
tmp
= str.charAt(i);
-
arr[tmp -
'a']++;
-
}
-
int
max
=
0;
-
for(
int
i
=
1; i < arr.length; i++) {
-
if(arr[i] > arr[max]) {
-
max = i;
-
}
-
}
-
System.out.println((
char)(max +
'a'));
-
System.out.print(arr[max]);
-
scan.close();
-
}
-
}
小结:
在刷题时要多留意一些细节性的问题,善于总结,坚持下去会有不一样的收获。
转载:https://blog.csdn.net/weixin_62353436/article/details/127787952