蓝桥杯注意事项和常错基本知识
遇到填空题,只需要填写一个数字。像回文数字,用暴力解题法,自己想或者借助计算机用眼睛看出来,写多不得分。
‘B’ - ‘A’ = 1
遇到长数字要翻转的,要用/10方法,不能用string,因为会溢出。
遇到字符串计数的,可以用固定分配28个空间的字符数组,分别计算。
char[] chs = scanner.nextLine().toCharArray();
counts[chs[i] - ‘A’] += 1;Arrays.sort(int[] a)
这种形式是对一个数组的所有元素进行排序,并且是按从小到大的顺序。Arrays.sort(int[] a, int fromIndex, int toIndex)
这种形式是对数组部分排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序,注意:下标为toIndex的元素不参与排序。10进制转16进制:System.out.printf(“%X”, n);
16进制转10进制 :
String string = scanner.nextLine();
System.out.print(Long.valueOf(string,16));
int x=Integer.parseInt(str,16);输入的是不带0x表示的十六进制数,直接转换即可
int x=Integer.parseInt(str.substring(2),16);输入的是带有0x标识的十六进制数,需要截去前面两位标识
Math.pow(底数,几次方)
char(int):根据ascii码取得其对应的字符
Integer.toBinaryString(int i):返回int变量的二进制表示的字符串。
toString() : 把对象转成字符串
String str [] = s.nextLine().trim().split(" ");//把输入的字符串去掉首尾的空格后以" "为条件分割成一个String数组。
用Date时要注意时区问题,我们是东8区,一开始是1900-01-01 8:00:00所有要减去8个小时的毫秒数
long n = sc.nextLong(); n-=8*3600*1000; Date date = new Date(n); SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); System.out.println(format.format(date));
将ASCII码转为大写字母 int i = ‘A’+1; //66
char res = (char)i; //B
考察内容
计算机算法:
枚举、排序、搜索、计数、贪心、动态规划、图论、数论、博弈论*、概率论*、计算几何*、字符串算法等。
数据结构:
数组、对象/结构、字符串、队列、栈、树、图、堆、平衡树/线段树、复杂数据结构*、嵌套数据结构*等
考试时注意
Java 选手请务必不要使用 package 语句,并且确保自己的主类名称为 Main,否则会导
致评测系统运行时找不到主类而得 0 分。
Java 选手如果程序中引用了类库,在提交时必须将 import 语句与程序的
其他部分同时提交。只允许使用 Java 自带的类库。
字符
给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。
这里是26为一个循环,可以想象成是26进制的数。
最后检查字符串的顺序是否正确
Character character = (char) (‘A’ + 28 % 26); 答案为C
public String convertToTitle(int columnNumber) {
StringBuffer sb = new StringBuffer();
while (columnNumber != 0) {
columnNumber--;
sb.append((char)(columnNumber % 26 + 'A'));
columnNumber /= 26;
}
return sb.reverse().toString();
}
另一种简洁的写法
public String convertToTitle(int columnNumber) {
return columnNumber == 0 ? "" : convertToTitle(--columnNumber / 26) + (char)('A' + (columnNumber % 26));
}
反过来
public int titleToNumber(String columnTitle) {
int ans = 0;
for(int i = 0; i < columnTitle.length(); i++){
ans = ans*26+(columnTitle.charAt(i)-'A'+1);
}
return ans;
}
二叉树的前序、中序、后序遍历
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
preorder(root, res);
return res;
}
public void preorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
res.add(root.val); //前序遍历
preorder(root.left, res);
preorder(root.right, res);
}
爬楼梯(可以爬1/2个台阶)和斐波拉契数列
public int climbStairs(int n) {
if (n==0||n==1 || n==2) {
return n;
}
int first=1,two=2;
int sum=0;
for (int i = 3; i <= n; i++) {
sum=first+two;
first=two;
two=sum;
}
return sum;
}
星期问题
已知今天是星期六,请问 20 22 ^{22} 22 天后是星期几?
1 到 7 表示星期一到星期日
一般是mod 7求重复的数;这时可以借助计算器
注意 如果用代码计算要防止 int 会溢出;这时用BigInteger
返回数组的形式
熟悉JDK的好处:
颠倒给定的 32 位无符号整数的二进制位
public int reverseBits(int n) {
return Integer.reverse(n);
}
查看是否超时
public static void main(String[] args) {
long start = System.currentTimeMillis();
//你写的程序
long end = System.currentTimeMillis();
System.out.println(end-start);
}
注意:默认的是毫秒值,1s = 1000ms
输入输出,读写用法的区别
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
sc.next(); //空格、tab键、enter键看成分隔符/结束符,开头会忽略,结尾遇到会结束
sc.nextLine();//遇到空格会读取,遇到enter会结束
}
注意:bufferreader虽然快,但是简单读取字符序列。使用的对象是readline,必须处理掉Java. io .exception异常
格式化输出
public static void main(String[] args) {
Date date = new Date();
String f = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(f);
System.out.println(sdf.format(date));
}
常用API
String string ;
string.charAt(index); //找出对应下标的字符
string.toCharArray();//将字符串变成字符数组
string.contains(s);//是否包含
string.split(" ");//用字符串分割
StringBuilder stringBuilder;
stringBuilder.reverse();//反转
//没有equals方法,所以比较的是两个对象的地址是否相等。要转为string类型!!!
Calendar calendar = Calendar.getInstance();//没有new方法
calendar.set(Calendar.YEAR, 2023);
calendar.set(Calendar.MONTH, 0); //1月份
calendar.set(Calendar.DAY_OF_WEEK, 1); //周日
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));
BigInteger bigInteger;
bigInteger.abs(a);//绝对值
bigInteger.add(a);
bigInteger.subtract(val);
bigInteger.multiply(val);
bigInteger.divide(val); //除
bigInteger.mod(m); //取模
bigInteger.remainder(val);//求余
bigInteger.pow(exponent); //次方
bigInteger.negate(); //相反数
bigInteger.compareTo(val);//1,表示大于;0表示等于
二维数组的另类设置
List<Integer> t = new ArrayList<Integer>();
List<List<Integer>> ans = new ArrayList<List<Integer>>();
Collections.sort(ans);//记得要用collectionS
最后,给eclipse设置代码自动提示功能,加快效率