目录
前言:
一、门牌制作
解析:
代码实现
二、寻找2020
解析:
代码实现
三、蛇形填数
解析:
代码实现
四、成绩分析
解析:
代码实现
五、单词分析
解析:
代码实现
小结:
前言:
算法的题目需要时间去沉淀。当我们有了一定的刷题量,思路就会开阔很多,年轻人加油吧🤞
一、门牌制作
解析:
遍历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();
}
}
小结:
在刷题时要多留意一些细节性的问题,善于总结,坚持下去会有不一样的收获。