枚举
枚举的定义
枚举算法(穷举算法),这种算法就是在解决实际问题的时候去使用所有的方式去解决这个问题,会通过推理去考虑事件发生的每一种可能性,最后推导出结果
优点 简单粗暴,他暴力的枚举所有可能,尽可能地尝试所有的方法(时间复杂度很高,通过不了,只能通过部分案例)
缺点 大部分题目使用枚举拿不到满分
枚举的技巧
1 确定解的类型
在进行枚举之前,我们要确定解的类型是什么,如果是求满足条件的数目,那我们就枚举的每个变量,计算一共有多少个满足条件的数据。如果是满足条件区间的个数,那我们就枚举每个区间。
2 选择枚举的方法
常见的枚举方法有直接枚举法(for )
3 判断是否满足条件
在枚举出一个解后,我们需要判断其是否是可行解
题目解析
1 标题统计
问题描述
输入一行字符串,计算这个字符 串中有多少个字符?
注意
字符串中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题的字符数时,空格和换行符不计算在内。
解题步骤
1 确定解的类型(分析题目的结果,是合理数据的数量,还是合理区间的数量)
2 确定枚举方法(for循环,递归函数)
3 判断当前数据是否符合题意(符合题意,把数据添加到结果集中,不符合就遍历下一个数据)
4 当前枚举算法是否需要优化,怎么去优化
package Accommodate; import java.util.*; public class Main1 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); String str=scan.nextLine(); /*接受来自控制台的数据 *不适用next() */ int sum=0; for(int i=0;i<str.length();i++) { if(str.charAt(i)!='\n'&&str.charAt(i)!=' ') { sum++; } } System.out.print(sum); } }
2 计数问题
问题 计算在区间1到n的所有整数中,数字x(0<=x<=9)出现了多少次?
package Accommodate; import java.util.*; public class Main2 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); int n =scan.nextInt(); int x=scan.nextInt(); int s=0; for(int i=1;i<=n;i++) { String a=i+"";//当前数字强行转化为字符串 for(int j=0;j<a.length();j++) { //循环遍历每个转换成字符的数字 int c=a.charAt(j)-'0'; /*字符转会数字str.charAt(i)是一个char型, * 减去'0', 就相当于把字符转成数字*/ if(c==x) { s++; } } }//当前数字是否是x System.out.print(s+" "); } }
模拟
模拟的定义
什么是模拟?
仅仅使用较简单的算法和数据结构的题目。
模拟顾名思义,就是按照题目的要求,一步步写出代码。
特点:
模拟题目通常具有码量大,操作多、思路繁复的特点。
模拟过程
1 读题 读懂题目的意思
2 建模 利用什么样的数据结构来实现
3 代码实现 写出代码框架
4 调试、优化
例题讲解
题目
在一个n行m列的方格图上有一个位置上有地雷,另外一些位置为空。请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。
输入描述
第一行包含两个整数n,m
第二行到第n+1行每行包含m个整数,相邻整数之间用一个空格分隔
如果对应的整数为0,表示这一格没有地雷。如果对应的整数为1.表示这一格有地雷。
对于有地雷的方格,输出9
示例输入
3 4
0 1 0 0
1 0 1 0
0 0 1 0
输出
2 9 2 1
9 4 9 2
1 3 9 2
package Accommodate; import java.util.*; public class Main3 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan=new Scanner(System.in); int n=scan.nextInt(); int m=scan.nextInt(); int[][]arr=new int [n][m]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { arr[i][j]=scan.nextInt(); } }//获取数据 for(int i=0;i<n;i++) { for(int j=0;j<m;j++) {//a[i][j] if(arr[i][j]==1) { System.out.print(9+" "); }else { int ans=0;//计数 for(int a=i-1;a<=i+1;a++) {//九空格 for(int b=j-1;b<=j+1;b++) { if(a<0||a>=n||b<0||b>=m)continue; if(arr[a][b]==1)ans++;//九空格中存在数为1的,累加他们的和 } } System.out.print(ans+" "); } } System.out.println(); } } }