🌲本文收錄于專欄《技術專家修煉》
試用于學完「Java基礎語法」后的鞏固提高及「LeetCode刷題」前的小試牛刀,作者其它優質專欄推薦:
📚《原始碼中的設計模式》——理論和實戰的完美結合
📚《leetcode 300題》——每天一道演算法題,進大廠必備
📚《從實戰學python》——Python的爬蟲,自動化,AI等實戰應用(代碼開源)
Java入門練習100例1-10原始碼 提取碼: uqqe
文章目錄
- 01.控制臺列印——人生若只如初見,環境變數配一遍
- 題目描述
- 知識點
- 解題思路
- 1.環境搭建
- 2.開發工具
- 3.輸出陳述句
- 代碼實作
- 總結
- 02.鍵盤輸入——三種方式
- 題目描述
- 知識點
- 解題思路
- 1.鍵盤輸入
- 2.數學運算函式
- 3.型別轉換
- 代碼實作
- 擴展總結
- 03.短路與和邏輯與的區別——老實人和機靈鬼
- 題目描述
- 知識點
- 解題思路
- 代碼實作
- 總結
- 04.三數排序——兩數交換高級演算法
- 題目描述
- 知識點
- 解題思路
- 1.if判斷
- 2.兩數交換
- 代碼實作
- 總結
- 05.計算 5+ 55 + 555 + ... 的前10項的和——for回圈
- 題目描述
- 知識點
- 解題思路
- 1.for回圈
- 2.找規律
- 代碼實作
- 總結
- 06.計算 1 + 1/2! + 1/3! + 1/4! + ... + 1/20! 的值——初窺動態規劃
- 題目描述
- 知識點
- 解題思路
- 1.回圈結構
- 2.階乘的計算
- 3.初窺動態規劃
- 代碼實作
- 總結
- 07.各數字的和——取余運算
- 題目描述
- 知識點
- 解題思路
- 代碼實作
- 總結
- 08.素數和——break和continue
- 題目描述
- 知識點
- 解題思路
- 1.素數的定義
- 2.break和continue
- 3.開方運算
- 代碼實作
- 擴展總結
- 09.陣列中的最小值——一維陣列
- 題目描述
- 知識點
- 解題思路
- 1.什么是陣列
- 2.排序演算法
- 代碼實作
- 擴展總結
- 10.各行元素之和——二維陣列
- 題目描述
- 知識點
- 解題思路
- 1.二維陣列
- 2.雙重回圈
- 代碼實作
- 擴展總結
01.控制臺列印——人生若只如初見,環境變數配一遍
題目描述
難度:簡單
在控制臺列印“Hello Java!”
知識點
- 配置環境變數
- 輸出陳述句
解題思路
1.環境搭建
“工欲善其事必先利其器”,即使輸出陳述句很簡單,沒有運行環境,也是巧婦難為無米之炊,
在線環境
有很多小伙伴和我說,還沒等體驗Hello World的快感呢,就被配置環境變數勸退了,
一條找了在線環境供小伙伴先體驗一下,地址

Windows配置
Windows平臺是使用者最多,配置起來最麻煩的平臺,為了不被勸退,教大家最簡單的方法,
1.安裝JDK
不要更改安裝位置!目錄不要有中文!
2.打開環境變數
教大家最快打開環境變數的方法:
按快捷鍵win+R后,輸入“sysdm.cpl”,然后回車,完事,

3.新建JAVA_HOME
點擊新增——變數名:JAVA_HOM,變數值:JDK安裝路徑,
默認為:C:\ProgramFiles\Java\jdk1.8.0_79\bin
如此就可以,不用再配置path,class_path,
等你熟練掌握了,再研究都是什么意思即可,
Mac配置
由于Mac基于Linux內核,安裝即可,不需要配置環境變數,
2.開發工具
開發工具比較流行的有eclipse,idea,VScode等,個人推薦idea,有關使用參考我的專欄《玩轉IDEA》
3.輸出陳述句
System.out.println("Hello Java!");是Java語言的輸出陳述句,相比于python的print()復雜了不少,那Java的輸出陳述句到底是怎么實作的?
System:java.long包的類,在創建類檔案時就被加載,不需要引入,被final修飾,不能被實體化,
public final class System {
// ……
}
out:System類下的靜態變數,對應PrintStream類,同樣的還有in,err變數,
public final static PrintStream out = null;
println:PrintStream類的方法,就是在這里實作IO流的輸出,
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
代碼實作
/**
* https://www.nhooo.com/tool/java/
* 在控制臺列印"hello java"
*/
public class question_01 {
public static void main(String[] args) {
System.out.println("hello java");
}
}

總結
本篇文章帶大家搭好環境,并體驗了控制臺列印,
下一題是控制臺輸入,大家可以先思考一下🤔
加入組隊刷題
02.鍵盤輸入——三種方式
題目描述
難度:簡單
從鍵盤輸入一個數字,列印出該數字的絕對值,
知識點
- 鍵盤輸入
- 數學運算函式
- 型別轉換
解題思路
1.鍵盤輸入
和列印一樣,相比于python的
input(),Java的輸入也比較麻煩,但是作為初學者練習,屬于必會內容,下面一潭訓介紹三種輸入的方法,小伙伴們要注意他們的區別,
-
System.in
該方法能獲取從鍵盤輸入的字符,但只能針對一個字符的獲取,獲取的只是
char型別的,如果想獲得int,float等型別的輸入,比較麻煩,具體見代碼, -
InputStreamReader
可以獲取鍵盤輸入的字串,如果要獲取的是
int,float等型別的仍然需要轉換,具體見代碼, -
Scanner
可以獲取鍵盤輸入的字串,有現成的獲取
int,float等型別資料,非常方便,被廣泛使用,具體見代碼,
2.數學運算函式
Java 的
Math類包含了用于執行基本數學運算的屬性和方法,如初等指數、對數、平方根和三角函式,Math 的方法都被定義為
static形式,通過Math類可以在主函式中直接呼叫,下面簡單介紹幾個常用的函式,具體見代碼,
abs()回傳引數的絕對值,min()回傳兩個引數中的最小值,max()回傳兩個引數中的最大值,pow()回傳第一個引數的第二個引數次方,sqrt()求引數的算術平方根,random()回傳一個亂數,Math.PI圓周率
3.型別轉換
Java支持顯示和隱式轉換,在實際應用中要善于使用包裝類的parseXXX()和valueOf()方法,
特別的,char轉int可以通過ascii的方式,例:
char ch = '9';
int i=ch-'0'
System.out.println(i);
代碼實作
三種方法實作,
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
/**
* 從鍵盤輸入一個數字,列印出該數字的絕對值,
*/
public class question_02 {
public static void main(String[] args) throws IOException {
question_02 question02 = new question_02();
question02.method1();
// question02.method2();
// question02.method3();
}
//System.in
public void method1() throws IOException {
System.out.println("Please Enter Data:");
char i = (char)System.in.read();
System.out.println("System.in --> "+Math.abs(i-'0'));
}
//InputStreamReader
public void method2() throws IOException {
System.out.println("Please Enter Data:");
//new一個InputStreamReader物件
InputStreamReader is = new InputStreamReader(System.in);
//BufferedReader的有參構造的方法
BufferedReader br = new BufferedReader(is);
//讀取一行,拋出例外
String line = br.readLine();
System.out.println("InputStreamReader --> "+Math.abs(Integer.parseInt(line)));
}
//Scanner
public void method3(){
System.out.println("Please Enter Data:");
Scanner sc = new Scanner(System.in);
//讀取int
int i = sc.nextInt();
//String s = sc.nextLine(); 讀取字串型輸入
//float f = sc.nextFloat(); 讀取float型輸入
System.out.println("Scanner --> "+Math.abs(i));
}
}
輸出結果


擴展總結
思考:
sc.next()和sc.nextLine()有什么區別?
答:next()遇到空格停止接收,
03.短路與和邏輯與的區別——老實人和機靈鬼
題目描述
難度:簡單
/** * 短路與和邏輯與 */ public class question_03 { public static void main(String[] args){ int i=5; boolean e = i > 6 & i++ > 7; System.out.println(e); System.out.println(i); e = i > 6 && i++ > 7; System.out.println(e); System.out.println(i); } }請寫出以上代碼的輸出
知識點
- 關系運算子
- 自增運算
解題思路
-
邏輯與(&)和短路與(&&)在運算上對條件的結果判斷不會產生影響,但會對條件本身的運算有影響,
-
邏輯與(&)在運算時會連續運算所有需要判斷的命令.但短路與當遇到
false時就停止運算,
代碼實作
分析
第一次判斷是邏輯與,老實人不管對錯,全部計算一下,則i++被執行,輸出e=false;i=6;
第二次判斷是短路與,機靈鬼先判斷第一個是錯的,就不再往下計算,i++不被執行,輸出e=false;i=6;
驗證

總結
在實際開發中為了增強代碼的可讀性,統一使用短路與,且不在判斷條件中做任何運算,
04.三數排序——兩數交換高級演算法
題目描述
難度:簡單
用if陳述句實作a、b、c的值按從小到大排序
知識點
if判斷- 兩數交換
解題思路
1.if判斷
本題整理的思路就是比較 - > 交換,
if作為一種分支結構,用來根據判斷條件的不同做不同的后續處理,
2.兩數交換
通常的做法,好比交換兩個杯子的水,需要先找來一個空杯子,也就是一個臨時變數存值,代碼如下:
int t=a;
a=b;
b=t;
高級做法,不使用其他變數如何做?思考🤔一下,文末給出答案,
代碼實作
/**
* 用if陳述句實作a、b、c的值按從小到大排序
*/
public class question_04 {
public static void main(String args[]){
int a=9,b=5,c=7,t;
if(a>b) {
t=a; a=b; b=t;
}
if(a>c) {
t=a; a=c; c=t;
}
if(b>c) {
t=b; b=c; c=t;
}
System.out.println("a="+a+",b="+b+",c="+c);
}
}
輸出結果

總結
如何不用其他變數交換兩個數的值?
答,將兩個數做加/乘法,在做減/除法,代碼如下:
a=a*b;
b=a/b; //等價于 a*b/b=a,即將a的值賦給了b
a=a/b; //等價于 a*b/a=b,即將b的值賦給了a
加減的方式留給大家去實作,
05.計算 5+ 55 + 555 + … 的前10項的和——for回圈
題目描述
難度:簡單
計算 5+ 55 + 555 + … 的前10項的和
知識點
- for回圈
- 簡單數學
解題思路
1.for回圈
簡單的for回圈的應用,確定好初始值,步長,終止值即可,
2.找規律
難點在如何確定加數,即找到加數之間的規律,
不難發現每一個加數是前一個加數的10倍+5,
??注意一點:最終的結果可能會超出int的范圍,需要使用long,
代碼實作
/**
*計算 5+ 55 + 555 + ... 的前10項的和
*/
public class question_05 {
public static void main(String args[]){
//定義變數
long sum=0,a=5,item=a;
//初值1,步長1,終值10
for(int i=1;i<=10;i++) {
//追加到總和
sum=sum+item;
//確定下一個加數
item=item*10+a;
}
System.out.println(sum);
}
}
輸出結果

總結
除了for回圈,用while能否實作呢?什么時候用for?什么時候用while?
06.計算 1 + 1/2! + 1/3! + 1/4! + … + 1/20! 的值——初窺動態規劃
題目描述
難度:簡單
計算 1 + 1/2! + 1/3! + 1/4! + … + 1/20! 的值,
知識點
- 回圈結構
- 階乘的計算
- 初窺動態規劃
解題思路
1.回圈結構
觀察算式的規律,從1-20,每次加1,回圈20次,
2.階乘的計算
n!是為階乘,等于1*2*3*4...(n-1)*n
3.初窺動態規劃
動態規劃,一直是演算法中的難點,本次不做深度講解,通俗的說一下,
就是把復雜問題簡單化,比如4 的階乘可以看到3 的階乘再乘4,而3的階乘可以看做2的階乘再乘3,2的階乘等于1乘2,
其實就是這樣一個思想,可以看下leetcode《爬樓梯》這道題,
代碼實作
/**
* 計算 1 + 1/2! + 1/3! + 1/4! + + 1/20! 的值
*/
public class question_06 {
public static void main(String args[]) {
double sum=0,a=1;
int i=1;
while(i<=20) {
sum=sum+a;
i=i+1;
//關鍵點,動態規劃思想
a=a*(1.0/i);
}
System.out.println("sum="+sum);
}
}
輸出結果

總結
上一節的問題:什么時候用for?什么時候用while?
答:其實兩者區別不大,大多數情況都可以解決問題,只需記住一點:回圈次數未知時用while,
07.各數字的和——取余運算
題目描述
難度:簡單
計算給定整數12345的各位上數字的和,
知識點
- 除法運算
- 取余運算
解題思路
解題的關鍵在于如何拿到各個位上的數字,
舉例:拿到34的個位和十位
int a=34;
//整除運算,拿到3
int b=34/10;
//回傳余數4
int c=34%10;
代碼實作
/**
* 計算給定整數12345的各數字的和,
*/
public class question_07 {
public static void main(String args[]) {
int y = 12345;
int r = 0 ;
int sum = 0;
while(y!=0) {
r = y % 10;
sum += r;
y = y / 10;
}
System.out.println("y = " + sum);
}
}
輸出結果

總結
熟練掌握取余和整除運算,大有作用,
08.素數和——break和continue
題目描述
難度:簡單
計算500以內的素數和,
知識點
- 素數的定義
break和continue- 開方運算
解題思路
1.素數的定義
大于1的自然數中,除了1和它本身以外不再有其他因數就叫做素數,
比如2=1×2;5=1×5;所以2、5就是素數,但6=1×6=2×3,即6除了1和自身6外還有其他因數2和3,不是素數,
2.break和continue
break:終止所有回圈,直接跳出,
continue:終止本次回圈,繼續執行下一次回圈,
3.開方運算
Math.sqrt()
代碼實作
/**
* 求500以內的素數和
*/
public class question_08 {
public static void main(String[] args) {
int sum=0,i,j;
for(j=2;j<=500;j++) {
for( i=2;i<=j/2;i++) {
if(j%i==0)
break; //說明除去1和本身有其他除數,不是素數,也就沒有繼續回圈的必要
}
if(i>j/2) { //i>j/2說明,break沒有被執行到,即除去1和本身無其他除數,是素數
sum+=j;
}
}
System.out.println(sum);
}
}
輸出結果

擴展總結
思考:如果是計算500w以內的素數和,如何提高效率呢?
回答:將j/2改為Math.sqrt(),
09.陣列中的最小值——一維陣列
題目描述
難度:簡單
輸出一維整型陣列中的值最小的那個元素及其下標,
知識點
- 一維陣列
- 排序
解題思路
1.什么是陣列
所謂的陣列指的就是一組相關型別的變數集合,并且這些變數可以按照統一的方式進行操作,
定義陣列
int data[] = new int[3];
// 陣列的長度為3,超過會報下標越界例外,且下標從0開始
添加元素
data[0] = 10; // 第一個元素
data[1] = 20; // 第二個元素
data[2] = 30; // 第三個元素
回圈列印
for(int x = 0; x < data.length; x++) {
System.out.println(data[x]); //通過回圈控制索引
}
2.排序演算法
其實嚴格來說我們并沒有用到排序演算法,但有一些思想在里面,想提前了解可以看這篇,
冒泡排序
代碼實作
/**
* 輸出一維整型陣列中的值最小的那個元素及其下標,
*/
public class question_09 {
public static void main(String args[]) {
int a[] = { 12, 24, 6, 37, 3, 22, 64 };
int min = 0;
for (int i = 1; i < a.length; i++) {
if (a[min] > a[i]) {
min = i;
}
}
System.out.println("a[" + min + "] = " + a[min]);
}
}
輸出結果

擴展總結
本節練習了一維陣列的操作,下一節練習二維陣列,
10.各行元素之和——二維陣列
題目描述
難度:簡單
計算二維陣列中各行元素之和并查找其值最大的那個行,
知識點
- 二維陣列
- 雙重回圈
解題思路
1.二維陣列
二維陣列本質上是以陣列作為陣列元素的陣列,即“陣列的陣列”,可以想像成一個方陣,
定義陣列
int brr [] []=new int[][3]; //二維陣列中行可以省略,至少寫出列
添加元素
brr[0][0]=1; //下標同樣從0開始,可以指定位置賦值,也可以整體賦值,
brr={
{1,2,3},
{5,6,7},
{9,10,11}
};
回圈遍歷
//遍歷行
for(int i=0;i<3;i++){
//遍歷列
for(int j=0;j<3;j++){
System.out.println(brr[i][j]);
}
}
2.雙重回圈
類似上面的回圈遍歷,
在實際應用中,雙重回圈能解決大部分問題,但其時間復雜度為O(n^2),盡量避免使用,
代碼實作
/**
*計算二維陣列中各行元素之和并查找其值最大的那個行,
*/
public class question_10 {
public static void main(String args[]) {
int myTable[][] = {
{22, 34, 45, 11, 33, 5, 92},
{17, 9, 27, 31, 46, 54, 88},
{98, 81, 64, 62, 15, 14, 23},
{54, 43, 55, 1, 22, 9, 33}
};
int sum, max, maxRow=0;
max = 0;
for (int row=0; row<4; row++) {
sum = 0;
for (int col=0; col<7; col++)
sum += myTable[row][col];
if (sum > max) {
max = sum;
maxRow = row;
}
}
System.out.println("Row: " + maxRow + " value: " + max);
}
}
輸出結果

擴展總結
在實際開發中,我們更多使用的集合,關于集合的知識,可以看我這篇:大廠面試突擊——集合篇,
11-100例正在來的路上,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/307603.html
標籤:java
上一篇:如何對照列舉值顯示下拉值?
