蓝桥杯java技巧总结
文章目錄
- 一、數據結構
- 1. 哈希表
- 2. 堆
- 二、對象數組排序
- 三、時間相關
- 1. String轉Date
- 2. Date轉String(標準格式化)
- 3. Calender類(日歷,星期)
- 4. 計算時間間隔
- 四、字符串
- 1.int和String的互相轉換
- 2.判斷一個字符串是否是回文
- 五、 BigInteger與BigDecimal
- 1.BigInteger
- 2.BigDecimal
- 六 、質數和公約數
- 1.判斷一個數是否是質數
- 2.求兩個數的最大公約數
- 3.分解質因數
- 七 、BFS和回溯DFS框架
- 回溯DFS
- BFS
后天就是藍橋杯國賽了,記錄一下java可能會用到的基礎知識,時間匆忙,如有錯處,歡迎批評指正
藍橋杯大賽歷屆真題
一、數據結構
棧和和隊列可以用Linkedlist<>實現
1. 哈希表
分為HashSet和HashMap
Set<Integer> set=new HashSet<Integer>(); set.add(1);//添加元素 set.remove(1);//刪除元素 if(set.contains(1)) {...}//判斷是否包含某個元素 int len=set.size();//獲得集合長度 Map<Character,Integer> map=new HashMap<Character,Integer>(); map.put('a', 1); int num1=map.get('a'); int num2=map.getOrDefault('a',0); map.replace('a',2); map.remove('a');2. 堆
使用優先隊列(PriorityQueue)實現,默認是小根堆
Queue<Integer> q=new PriorityQueue<Integer>();//創建一個小根堆 Queue<Integer> q=new PriorityQueue<Integer>((e1,e2)->e2-e1);//創建一個大根堆 //(e1,e2)->e2-e1代表升序,可以自定義其他排序規則二、對象數組排序
快速對對象數組進行升序排序,使用Arrays.sort()函數
Arrays.sort(Object[] a,Comparator<? super T> c);//使用該參數時,排序的只能是對象數組 // 以第一列排序 int[][] a = new int[][]{{2, 1}, {1, 2}}; Arrays.sort(a, (e1, e2) -> e1[0] - e2[0]); Integer[] i=new Integer[]{1,3,2}; Arrays.sort(i,(e1,e2)->e2-e1);//注意int數組只能轉為Integer數組才能使用該表達式 int[][] a=new int[][]{{3,1},{3,2},{1,2}}; Arrays.sort(a,(e1,e2)->{if(e1[0]==e2[0])return e2[1]-e2[1];//若第一列相同按第二列排序return e1[0]-e2[0];//按第一列排序 });三、時間相關
參考:https://blog.csdn.net/Mxeron/article/details/122798649
1. String轉Date
import java.text.ParseException; import java.text.SimpleDateFormat; String s1 = "2021-7-24"; String s2 = "2022-7-24"; //yyyy-MM-dd,注意MM必須大寫 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 轉換成date1需要拋出異常 try {Date date1 = sdf.parse(s1);} catch (ParseException e) {e.printStackTrace(); }2. Date轉String(標準格式化)
Date date = new Date(120000000); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(date));3. Calender類(日歷,星期)
Calender的月份MONTH是從0開始,也就是1-12月對應 0-11,但日期和年份是從1開始的。DAY_OF_WEEK從1開始,也就是周日到周六對應 1-7。
周日是1,周一是2,周六是7。1月是0,12月是11。
4. 計算時間間隔
主要是通過使用SimpleDateFormat,先把時間寫成String,然后再轉成Date, 用getTime函數轉成毫秒,相減得到相差的毫秒數。注意1s = 1000ms,SimpleDateFormat中,HH代表24小時制,hh是12小時制,MM是月份,mm是分鐘。
String start = "2021-7-13 13:14:20"; String end = "2021-7-10 13:14:20"; // 注意HH是24小時,hh是12小時 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date1 = sdf.parse(start); Date date2 = sdf.parse(end); // 因為不知道誰大誰小,所以要用abs long diff = Math.abs(date1.getTime() - date2.getTime()); System.out.println("相差" + diff + "毫米"); // 注意1s = 1000ms long seconds = diff / 1000;//秒 long minutes = diff / 1000 / 60;//分鐘 long hours = diff / 1000 / 60 / 60;//小時 long day = diff / 1000 / 60 / 60 / 24;//天四、字符串
1.int和String的互相轉換
//int轉String int i=1; String s=""+i: //String轉int String s=”3”; int i=Integer.parseInt(s);2.判斷一個字符串是否是回文
方法一:判斷字符串的i到j位是否是回文
public static boolean isPalindrome(String s, int i, int j){while(i<j){if(s.charAt(i)!=s.charAt(j)){return false;}i++;j--;}return true;}方法二:快速判斷,一個數字是否是回文
class Solution {public boolean isPalindrome(int x) {StringBuffer s=new StringBuffer(Integer.toString(x));String a=s.toString();//創建一個新字符串記錄原來的值return a.equals(s.reverse().toString())?true:false;} }五、 BigInteger與BigDecimal
大整數題目
1.BigInteger
import java.math.BigInteger; import java.util.Scanner;public class Main {public static void main(String[] args) {// 傳入字符串才能形成大數,默認是把字符串當成十進制BigInteger bs = new BigInteger("15666666666666666");BigInteger bs1 = new BigInteger("100002123123123");//加減乘除bs.add(bs1);bs.subtract(bs1);bs.multiply(bs1);bs.divide(bs1);//取商 // 取余bs.mod(bs1);bs.remainder(bs1);// 返回大整數的double、float類型bs.doubleValue();bs.floatValue();// 求最大公約數bs.gcd(bs1);// 9、將當前大整數轉成十進制字符串形式System.out.println(bs.toString());// 也可以把字符串當成二進制傳入,生成十進制大數BigInteger bs2 = new BigInteger("100000", 2);System.out.println(bs2);} }2.BigDecimal
對BigDecimal做加、減、乘時,精度不會丟失,但是做除法時,存在無法除盡的情況,這時,就必須指定精度以及如何進行截斷。
package Chapter_5;import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);// 大小數BigDecimal bs = scan.nextBigDecimal();// 獲取小數位數,如果是整數則輸出負數,表示末尾0的個數System.out.println(bs.scale());// 去掉小數末尾無用的0System.out.println(bs.stripTrailingZeros());// 設置小數位數,可以選擇四舍五入或者直接截斷System.out.println(bs.setScale(4, RoundingMode.HALF_UP)); // 四舍五入// 對BigDecimal做加、減、乘時,精度不會丟失,但是做除法時,存在無法除盡的情況,這時,就必須指定精度以及如何進行截斷。BigDecimal d1 = new BigDecimal("123.456");BigDecimal d2 = new BigDecimal("23.456789");BigDecimal d3 = d1.divide(d2, 10, RoundingMode.HALF_UP); //保留10位小數并四舍五入BigDecimal d4 = d1.divide(d2); // 報錯:ArithmeticException,因為除不盡//比較兩個BigDecimal,不能用equals()因為小數的個數問題,要用compareTo()//它根據兩個值的大小分別返回負數、正數和0,分別表示小于、大于和等于d1.compareTo(d2)} }六 、質數和公約數
參考
https://blog.csdn.net/GD_ONE/article/details/104579936
https://blog.csdn.net/Mxeron/article/details/122798649
1.判斷一個數是否是質數
假設該數為n, 我們只需要判斷[2,sqrt{n}]內是否有n的因子。如果有,則n為合數,否則,n為質數。這種方法被稱為試除法, 即試著除一下所有可能的因子。
public static Boolean isprime(int n){if(n == 1) return false;for(int i = 2; i<= n/i ; i++){if(n % i == 0){return false;}}return true; }2.求兩個數的最大公約數
//遞歸(返回最大公約數) int gcd(int a,int b){return b==0?a:gcd(b,a%b); }3.分解質因數
設一個質數為p.如果n%p == 0,那么p就是n的一個質因數,接下來就是求p的指數,我們讓n = n/p, 這樣就從n中剔除了一個p,接著重復上述兩步,直到n%p != 0
public static void prime(int n){for(int i = 2; i <= n/i ; i++){//判斷條件用n/i,以防i*i<=n發生溢出int a = 0;//每次循環都要清零while(n % i == 0){n /= i;a++;}if(a > 0)System.out.println(i + "" + a);//i的a次方}//若該數是質數,那么應該將自身(n)也加入if(n > 1) System.out.println(n + " " + 1); }七 、BFS和回溯DFS框架
回溯DFS
回溯算法框架。解決一個回溯問題,實際上就是一個決策樹的遍歷過程。你只需要思考 3 個問題:
1、路徑:也就是已經做出的選擇。
2、選擇列表:也就是你當前可以做的選擇。
3、結束條件:也就是到達決策樹底層,無法再做選擇的條件。
BFS
本質上就是一幅「圖」,讓你從一個起點,走到終點,問最短路徑,這就是 BFS 的本質。
圖可能會走回頭路,所以要用visited數組存儲已經訪問過的節點。
總結
以上是生活随笔為你收集整理的蓝桥杯java技巧总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Amoeba
- 下一篇: jQuery validate 添加表单