日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

蓝桥杯java技巧总结

發布時間:2023/12/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蓝桥杯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。

// 創建Calendar實例 Calendar c = Calendar.getInstance(); // 用日期賦值2021年7月1日,或者是用Date賦值c.setTime(Date date); c.set(2021, 7 - 1, 1); System.out.println(c.get(Calendar.YEAR));//年 System.out.println(c.get(Calendar.MONTH) + 1);//月 System.out.println(c.get(Calendar.DATE));//日 System.out.println(c.get(Calendar.DAY_OF_WEEK));// 星期幾,1是星期日 // 這年的第幾天,從1開始算 System.out.println(c.get(Calendar.DAY_OF_YEAR)); // 這個月的第幾天,從1開始算 System.out.println(c.get(Calendar.DAY_OF_MONTH)); // 這個月的第幾周,從1開始算 System.out.println(c.get(Calendar.DAY_OF_WEEK_IN_MONTH));

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、結束條件:也就是到達決策樹底層,無法再做選擇的條件。

代碼方面,回溯算法的框架: result = [] def backtrack(路徑, 選擇列表):if 滿足結束條件:result.add(路徑)returnfor 選擇 in 選擇列表:做選擇backtrack(路徑, 選擇列表)撤銷選擇

BFS

本質上就是一幅「圖」,讓你從一個起點,走到終點,問最短路徑,這就是 BFS 的本質。
圖可能會走回頭路,所以要用visited數組存儲已經訪問過的節點。

/ 計算從起點 start 到終點 target 的最近距離 int BFS(Node start, Node target) {Queue<Node> q; // 核心數據結構HashSet<Node> visited; // 保存已經訪問過的節點,避免走回頭路q.offer(start); // 將起點加入隊列visited.add(start);int step = 0; // 記錄擴散的步數while (!q.isEmpty) {int sz = q.size();/* 將當前隊列中的所有節點向四周擴散 */for (int i = 0; i < sz; i++) {Node cur = q.poll();/* 劃重點:這里判斷是否到達終點 */if (cur is target)return step;/* 將 cur 的相鄰節點加入隊列 */for (Node x : cur.adj())if (x not in visited) {q.offer(x);visited.add(x);}}/* 劃重點:更新步數在這里 */step++;} }

總結

以上是生活随笔為你收集整理的蓝桥杯java技巧总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。