作者介紹:
????作者:偷偷敲代碼的青花瓷????????
文章目錄
- ????程式設計題【全面深度解析】
- ✨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.本題,
首先要判斷素數
2.
素數表示除過1和本身,不能被其他數整除
,(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
的第j位到第i位,隻需要
m
。
把n先右 移j位,然後再進行或運算(|)即可
實作:
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)),周遊一遍後得到結果。
實作:
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刷題特輯的第一天喲????~
“種一顆樹最好的是十年前,其次就是現在”
是以,
“讓我們一起努力吧,去奔赴更高更遠的山海”