蓝桥杯-算法解题思路+注意事项

文章提供了蓝桥杯竞赛中需要注意的编程细节,如填空题的解答策略,数字翻转的方法,字符串计数的处理,以及各种进制转换。还介绍了算法和数据结构的基础知识,如枚举、排序、字符串算法等,并强调了Java选手的提交规范。此外,文章还给出了二叉树遍历、斐波那契数列和日期处理的示例代码。
摘要由CSDN通过智能技术生成

蓝桥杯注意事项和常错基本知识

  1. 遇到填空题,只需要填写一个数字。像回文数字,用暴力解题法,自己想或者借助计算机用眼睛看出来,写多不得分。

  2. ‘B’ - ‘A’ = 1

  3. 遇到长数字要翻转的,要用/10方法不能用string,因为会溢出。

  4. 遇到字符串计数的,可以用固定分配28个空间的字符数组,分别计算。
    char[] chs = scanner.nextLine().toCharArray();
    counts[chs[i] - ‘A’] += 1;

  5. Arrays.sort(int[] a)
    这种形式是对一个数组的所有元素进行排序,并且是按从小到大的顺序。

  6. Arrays.sort(int[] a, int fromIndex, int toIndex)
    这种形式是对数组部分排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序,注意:下标为toIndex的元素不参与排序。

  7. 10进制转16进制:System.out.printf(“%X”, n);

  8. 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标识的十六进制数,需要截去前面两位标识

  9. Math.pow(底数,几次方)

  10. char(int):根据ascii码取得其对应的字符

  11. Integer.toBinaryString(int i):返回int变量的二进制表示的字符串。

  12. toString() : 把对象转成字符串

  13. String str [] = s.nextLine().trim().split(" ");//把输入的字符串去掉首尾的空格后以" "为条件分割成一个String数组。

  14. Date时要注意时区问题,我们是东8区,一开始是1900-01-01 8:00:00所有要减去8个小时的毫秒数

  15. 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));

  16. 将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设置代码自动提示功能,加快效率

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值