天天看點

【第一章】JAVA之牛客網刷題筆記【點進來花兩把遊戲的時間學習晚上睡覺都踏實了】

【第一章】JAVA之牛客網刷題筆記【點進來花兩把遊戲的時間學習晚上睡覺都踏實了】

作者介紹:

????作者:偷偷敲代碼的青花瓷????‍????

文章目錄

  • ​​????程式設計題【全面深度解析】​​
  • ​​✨1.【題目ID:36884-查找組成一個偶數最接近的兩個素數】知識點:查找​​
  • ​​✨2.【題目ID:24951-二進制插入】知識點:位運算​​
  • ​​✨3.【題目ID:36898-參數解析】知識點:字元串,String的運用​​
  • ​​✨4.【題目ID:46574-跳石闆】知識點:動态規劃​​
  • ​​✨總結​​

前言

同學們,我們在不斷學習知識的同時????也要不斷提高我們的代碼編寫能力,和代碼思維????在以後的時間裡,就由我每天來給大家帶來一些精彩的題目????????

梅花香自苦寒來,寶劍鋒從磨砺出,隻要我們每天進步一點點,在不久的将來,你我必會大放光彩????

????程式設計題【全面深度解析】

✨1.【題目ID:36884-查找組成一個偶數最接近的兩個素數】知識點:查找

描述:

任意一個​

​偶數(大于2)​

​都可以​

​由2個素數組成​

​,組成偶數的2個素數有很多種情況,本題目要求輸出組成指定偶數的兩個素數內插補點​

​最小的素數對​

​。

輸入:20
輸出:7  13
輸入:4
輸出:2  2      

????題目傳送門:​​OJ連結​​

思路:

1.本題​

​首先要判斷素數​

​,​

​素數表示除過1和本身,不能被其他數整除​

​ 2.​

​最近的兩個素數應該從中間的位置開始向兩邊查找​

​,(i 和 n-i )

實作:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
            int n = sca.nextInt();
            int half = n/2;
            for(int i = half;i > 0;i--) {
                if(isPrime(i)&&isPrime(n-i)) {
                    System.out.println(i);
                    System.out.println(n-i);
                    break;
                }
            }        
    }
    public static boolean isPrime(int nums) {
        for(int i = 2;i*i<= nums;i++) {
            if(nums%i == 0) {//如果能被整除說明不是素數
                return false;
            }
        }
        return true;
    }
    
}      

✨2.【題目ID:24951-二進制插入】知識點:位運算

描述:

給定​

​兩個32位整數n和m​

​,同時給定​

​i和j​

​,​

​将m的二進制數位插入到n的二進制的第j到第i位​

​,保證n的第j到第i位均為零,且m的二進制位數小于等于i-j+1,其中二進制的位數從0開始由低到高。

測試樣例:

1024,19,2,6
傳回:1100      

????題目傳送門:​​OJ連結​​

思路:

​n:1024:100000000 00​

​​ ​

​m:19 : 10011​

​​ 要把​

​n​

​的二進制值插入​

​m​

​的第j位到第i位,隻需要​

​把n先右 移j位,然後再進行或運算(|)即可​

​。
【第一章】JAVA之牛客網刷題筆記【點進來花兩把遊戲的時間學習晚上睡覺都踏實了】

實作:

import java.util.*;

public class BinInsert {
    public int binInsert(int n, int m, int j, int i) {
        // write code here
        m<<=j;//m右移動j位
        return m|n;//m或n 0|0 等于0 0|1 等于1
    }
}      

✨3.【題目ID:36898-參數解析】知識點:字元串,String的運用

描述:

在指令行輸入如下指令:

xcopy /s c:\ d:\e,

各個參數如下:

參數1:指令字​

​xcopy​

參數2:字元串​

​/s​

參數3:字元串​

​c:\\​

參數4: 字元串​

​d:\\e​

請編寫一個參數解析程式,​

​實作将指令行各個參數解析出來​

​。

解析規則:

1.參數分隔符為空格

2.對于用​

​""​

​包含起來的參數,​

​如果中間有空格,不能解析為多個參數​

​。比如在指令行輸入

xcopy /s “C:\program files” “d:”

時,參數仍然是4個,第3個參數應該是字元串C:\program files,而不是C:\program,注意輸出參數時,需要将""去掉,引号不存在嵌套情況。

3.參數不定長

4.輸入由用例保證,不會出現不符合要求的輸入

資料範圍:字元串長度:1\le s\le 1000\1≤s≤1000

進階:時間複雜度:O(n)\O(n) ,空間複雜度:O(n)\O(n)

輸入描述:

輸入一行字元串,可以有空格

輸出描述:

輸出參數個數,分解後的參數,每個參數都獨占一行

輸入:xcopy /s c:\\ d:\\e
輸出:4
xcopy
/s
c:\\
d:\\e      

????題目傳送門​​OJ連結​​

思路:

通過以​

​空格​

​​和​

​雙引号​

​​為間隔,統計參數個數,對于雙引号,通過添加​

​flag​

​,保證雙引号中的空格被輸出

實作:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        int count = 0;//記錄輸出
        for(int i = 0;i < str.length(); i++) {
            //如果遇到第一個雙引号,周遊整個字元串,直到碰到第二個雙引号為止
            //才說明雙引号中的參數周遊完了
            if(str.charAt(i)=='"') {
                do {
                    i++;
                }while(str.charAt(i) != '"');
            }
            if(str.charAt(i) == ' ') {
                count++;
            }
        }
        //參數的總個數 = 空格數+1
        System.out.println(count + 1);
        int flg = 1;
            for(int i = 0;i < str.length(); i++) {
             //當碰到第一個雙引号,flg變為0,碰到第二個雙引号flg重新變為1
                if(str.charAt(i) == '"') {
                   flg^=1;
                }
                //1.除了雙引号和特殊空格以外的字元都要列印
                if(str.charAt(i) != ' ' && str.charAt(i) != '"') {
                    System.out.print(str.charAt(i));
                }
                //2.在雙引号裡面的空格要列印
                if(str.charAt(i) == ' ' && flg == 0) {
                    System.out.print(str.charAt(i));
                }
                //3.在雙引号外面 遇到空格 列印換行
                if(str.charAt(i) == ' ' && flg == 1) {
                    System.out.println();
                }
            }
    }
}      

✨4.【題目ID:46574-跳石闆】知識點:動态規劃

描述:

易來到了一條石闆路前,每塊石闆上從1挨着編号為:1、2、3…

這條石闆路要根據特殊的規則才能前進:對于小易​

​目前所在的編号為K的 石闆​

​,小易​

​單次隻能往前跳K的一個約數(不含1和K)步​

​,即跳到K+X(X為K的一個非1和本身的約數)的位置。 ​

​小易目前處在編号為N的石闆,他想跳到編号恰好為M的石闆去​

​,小易想知道最少需要跳躍幾次可以到達。

例如:

N = 4,M = 24:

4->6->8->12->18->24

于是小易最少需要跳躍5次,就可以從4号石闆跳到24号石闆

輸入描述:

輸入為一行,有兩個整數N,M,以空格隔開。 (4 ≤ N ≤ 100000) (N ≤ M ≤ 100000)

輸出描述:

輸出小易最少需要跳躍的步數,如果不能到達輸出-1

輸入: 4 24
輸出 5      

????題目傳送門​​OJ連結​​

思路:

将1 - M個石闆看做一個結果數組stepNum,每個stepNum[i]儲存着從起點到這一步最小的步數,其中0為不

能到達。 從起點開始對stepNum進行周遊,先求i的所有約數(即從stepNum[i]能走的步數),然後更新那

幾個能到達的位置的最小步數。如果不能到達則更新為此時位置的最小步數 + 1,如果是能到達的就更新為

min(已記錄的最小步數,此處的最小步數 + 1)),周遊一遍後得到結果。

【第一章】JAVA之牛客網刷題筆記【點進來花兩把遊戲的時間學習晚上睡覺都踏實了】

實作:

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        int n = sca.nextInt(); //第N個台階開始
        int m = sca.nextInt(); //跳到第M個台階
        int[] step = new int[m+1];//為了和數組下标對應這裡為m+1
        for(int i =0;i < m+1;i++){
            step[i] =Integer.MAX_VALUE;
        }
        step[n] = 0;//起始位置n為0步
        for(int i =n;i < m;i++) {
            //從n開始跳
            if(step[i] == Integer.MAX_VALUE) {
                continue;
            }
            //求i的限制
            List<Integer> list = div(i);
            //j代表一次可以跳幾塊石闆
            //i代表目前石闆的編号
            for(int j : list){
                if(i+j<=m && step[i+j] !=Integer.MAX_VALUE) {
                    step[i+j] = Math.min(step[i+j],step[i]+1);
                }else if(i+j<=m) {
                    step[i+j] = step[i]+1;
                }
            }
        }
        if(step[m]==Integer.MAX_VALUE) {
            System.out.println(-1);
        }else{
            System.out.println(step[m]);
        }
    }
    //求限制
    public static List<Integer> div(int num) {
        //将限制 存放在 List 中
        List<Integer> list = new ArrayList<>();
        //題上說不包括1和K 這裡從2開始
        for(int i =2;i*i<=num;i++){
            if(num%i==0) {
                list.add(i);
                if(num/i!=i){//確定入list的數不重複
                    list.add(i);
                }
            }
        }
        return list;
    }
}      

✨總結

以上是JAVA刷題特輯的第一天喲????~

“種一顆樹最好的是十年前,其次就是現在”

是以,

“讓我們一起努力吧,去奔赴更高更遠的山海”