1 題目重述
題目描述: 選出幸運(yùn)手機(jī)號(hào)
解釋: 從傳入的若干個(gè)手機(jī)號(hào)碼中要糊,選中 n 個(gè)幸運(yùn)手機(jī)號(hào)扶檐,并返回 n 個(gè)幸運(yùn)手機(jī)號(hào)的號(hào)碼往果。
例如:
- 輸入:"133","131","153","180","177","130","181"
- 輸入: n =3
- 返回:幸運(yùn)手機(jī)號(hào)碼
2 題目分析
2.1 題目梳理
哈嘍磷雇,各位小伙伴羔砾,你在抽獎(jiǎng)的時(shí)候有沒有對(duì)它產(chǎn)生的幸運(yùn)號(hào)碼抱有大大的問號(hào),今天就和我一起來看看這背后的原理吧相艇!不過這道題目時(shí)一個(gè)簡單的實(shí)現(xiàn)哦颖杏,但是掌握了這個(gè)思路,就可以在此基礎(chǔ)上進(jìn)行復(fù)雜的加工啦坛芽。
好了留储,我們一起來看今天的題目吧!
題目關(guān)鍵字: 輸入若干手機(jī)號(hào)碼咙轩、選中幸運(yùn)手機(jī)號(hào)碼的個(gè)數(shù) n 获讳。
幸運(yùn)體現(xiàn)在什么地方呢?就是隨機(jī)性臭墨,若干個(gè)號(hào)碼中隨機(jī)的幾個(gè)號(hào)碼赔嚎,那不就是幸運(yùn)號(hào)碼了嗎?想想老師上課隨機(jī)提問胧弛,被抽到的小伙伴是不是所謂的“天選之子”呢尤误?
輸入若干手機(jī)號(hào)碼以及幸運(yùn)號(hào)碼的個(gè)數(shù),說得簡單一點(diǎn)结缚,就是輸入一個(gè)字符串以及一個(gè)整數(shù)损晤。采用 Scanner 類的 nextInt() 方法和 Scanner 類的 next() 方法就可以獲取到我們需要的信息了。
但是我們知道在字符串中红竭,我們并不容易拿出一個(gè)電話號(hào)碼的字符串尤勋,于是,我們可以先對(duì)輸入的字符串按指定元素進(jìn)行切割茵宪,切割后的字符串保存在字符串?dāng)?shù)組中最冰,于是我們可以根據(jù)隨機(jī)數(shù)的下標(biāo)拿出相應(yīng)的字符串。
電話號(hào)碼的數(shù)組已經(jīng)準(zhǔn)備好了稀火,我們開始思考如何保證隨機(jī)性呢暖哨,是不是需要有一個(gè)隨機(jī)數(shù)呢?我們?cè)趺丛谟?jì)算機(jī)上獲取隨機(jī)數(shù)字呢凰狞?Java 為我們提供了這樣的一個(gè)方法篇裁,我們可以創(chuàng)建 Random 類的對(duì)象 input ,調(diào)用 nextInt() 方法赡若,傳入?yún)?shù)n达布,即可為我們產(chǎn)生一個(gè)大于0,小于 n 的隨機(jī)整數(shù)逾冬。
隨機(jī)數(shù)產(chǎn)生了爆班,但是因?yàn)閿?shù)字的隨機(jī)性,我們同樣無法保證它會(huì)不會(huì)產(chǎn)生兩個(gè)相同的隨機(jī)數(shù)活鹰,如果隨機(jī)數(shù)相同,難道我們要有兩個(gè)一摸一樣的幸運(yùn)號(hào)碼嗎圾另?這顯然是不可能的霸株,于是雕沉,我們需要加以判斷。如果這個(gè)隨即下標(biāo)的對(duì)應(yīng)元素已經(jīng)被選中了去件,就不可以進(jìn)行二次選擇坡椒。那么我們可以將選中的元素先保存起來,再將其賦值為 null【空】尤溜,這樣一來倔叼,我們就可以保證隨機(jī)選中的元素不會(huì)重復(fù)。
另外宫莱,保存后的元素在一個(gè)數(shù)組中丈攒,無法直接輸出,我們需要采用 Arrays 類的 toString() 方法將一維數(shù)組轉(zhuǎn)換成字符串后進(jìn)行輸出授霸。
2.2 實(shí)現(xiàn)思路
2.2.1 輸入
采用 Scanner 類的 nextInt() 方法巡验,獲取一個(gè)整數(shù) n 。
采用 Scanner 類的 next() 方法碘耳,獲取一個(gè)字符串 str 显设。
2.2.2 截取
采用 String 類的 split( ) 方法,對(duì)字符串按照指定元素進(jìn)行切割辛辨。
2.2.3 產(chǎn)生隨機(jī)數(shù)下標(biāo)
采用 Random 類 nextInt() 方法捕捂,傳入?yún)?shù)n,即可產(chǎn)生一個(gè)大于0斗搞,小于 n 的隨機(jī)整數(shù)指攒。
2.2.4 判斷產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的下標(biāo)是否已經(jīng)存在
我們需要判斷產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的下標(biāo)是否已經(jīng)存在,如果存在僻焚,則此隨即下標(biāo)失效允悦,需要重新產(chǎn)生。我們將已經(jīng)存在的手機(jī)號(hào)碼賦值為 null溅呢,檢查隨機(jī)下標(biāo)對(duì)應(yīng)的手機(jī)號(hào)是否為null澡屡,既可以判斷幸運(yùn)手機(jī)號(hào)碼的下標(biāo)是否已經(jīng)存在。
如果為null 咐旧,代表該電話號(hào)碼已經(jīng)存在驶鹉,需要重新產(chǎn)生隨機(jī)下標(biāo),同時(shí)铣墨,該元素的下標(biāo)不能直接遞增室埋,需要先自減后再自增,如此一來,下表沒有變化姚淆,仍然保存在幸運(yùn)手機(jī)號(hào)的數(shù)組的同一位置孕蝉。最重要的是 我們需要退出當(dāng)前循環(huán),同時(shí)開始下一次循環(huán)腌逢,因此降淮,我們需要采用 continue 關(guān)鍵字,作用是:跳出本次循環(huán)并直接進(jìn)入下一次循環(huán)/
如果產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的下標(biāo)對(duì)應(yīng)的元素沒有存在搏讶,我們就將這個(gè)號(hào)碼保存至幸運(yùn)手機(jī)號(hào)的數(shù)組佳鳖,接著令這個(gè)下標(biāo)對(duì)應(yīng)的元素為 null ,代表該元素已經(jīng)存在媒惕,避免后續(xù)重復(fù)添加該手機(jī)號(hào)碼系吩。
2.2.5 輸出
采用 Arrays 類的 toString() 方法將一維數(shù)組轉(zhuǎn)換成字符串后進(jìn)行輸出。
3 代碼實(shí)現(xiàn)
3.1 實(shí)現(xiàn)方式
3.1.1 代碼語句:
public static void main(String[] args) {
// 1. 獲取手機(jī)號(hào)碼和幸運(yùn)手機(jī)號(hào)碼數(shù)量
Scanner input = new Scanner(System.in);
// 1.1 獲取手機(jī)號(hào)碼
System.out.println("請(qǐng)輸入?yún)⒓踊顒?dòng)的手機(jī)號(hào)碼:");
String phoneStr = input.next();
// 1.2 獲取幸運(yùn)手機(jī)號(hào)碼的數(shù)量
System.out.println("請(qǐng)輸入產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的數(shù)量:");
int n = input.nextInt();
// 1.3 對(duì)獲取手機(jī)號(hào)碼按照指定格式進(jìn)行切割
String[] phone = phoneStr.split(",");
// 2. 檢查幸運(yùn)手機(jī)號(hào)碼的數(shù)量是否超出已有手機(jī)號(hào)碼的數(shù)組長度
// 2.1 已有手機(jī)號(hào)碼的數(shù)組長度
int len = phone.length;
// 2.2 若超出妒蔚,則返回 提示信息
if (n > len) {
System.out.println("產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的數(shù)量輸入錯(cuò)誤穿挨!");
System.out.println("請(qǐng)重新輸入!");
}
// 3. 產(chǎn)生幸運(yùn)手機(jī)號(hào)碼
// 3.1 產(chǎn)生幸運(yùn)手機(jī)號(hào)碼數(shù)組
String[] luckPhone = new String[n];
// 3.2 產(chǎn)生隨機(jī)數(shù)的Random類的對(duì)象rand
Random rand = new Random();
for (int i = 0; i < n; i++) {
// 3.3 隨機(jī)產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的下標(biāo)
int index = rand.nextInt(len);
// 3.4 判斷產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的下標(biāo)對(duì)應(yīng)的元素是否為 null
// 目的:檢查該下標(biāo)對(duì)應(yīng)的手機(jī)號(hào)是否為null肴盏,如果為null重新產(chǎn)生隨機(jī)下標(biāo)
if (phone[index] == null) {
// 若是科盛,則下標(biāo)遞減,代表該位置的元素重新生成
i--;
// 跳出本次循環(huán)直接進(jìn)入下一次循環(huán)
continue;
}
// 若不為 null 叁鉴,則將該下標(biāo)對(duì)應(yīng)的元素賦值給幸運(yùn)手機(jī)號(hào)的數(shù)組
luckPhone[i] = phone[index];
// 令該下標(biāo)對(duì)應(yīng)元素為 null
// 目的:避免重復(fù)
phone[index] = null;
}
// 4.輸出幸運(yùn)手機(jī)號(hào)碼
System.out.println("參加游戲的手機(jī)號(hào)碼有:" + phoneStr);
System.out.println("產(chǎn)生的幸運(yùn)手機(jī)號(hào)碼為:" + Arrays.toString(luckPhone));
}
3.1.2 代碼結(jié)果:
請(qǐng)輸入?yún)⒓踊顒?dòng)的手機(jī)號(hào)碼:
133,131,153,180,177,130,181
請(qǐng)輸入產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的數(shù)量:
3
參加游戲的手機(jī)號(hào)碼有:133,131,153,180,177,130,181
產(chǎn)生的幸運(yùn)手機(jī)號(hào)碼為:[131, 177, 153]
請(qǐng)輸入?yún)⒓踊顒?dòng)的手機(jī)號(hào)碼:
133,131,153,180,177,130,181
請(qǐng)輸入產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的數(shù)量:
10
產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的數(shù)量輸入錯(cuò)誤土涝!
請(qǐng)重新輸入!
3.2 實(shí)現(xiàn)方式
如果你不想在產(chǎn)生幸運(yùn)手機(jī)號(hào)碼時(shí)幌墓,每次都寫這么多行代碼但壮,你也可以在第一次寫的時(shí)候,就將產(chǎn)生隨機(jī)號(hào)碼的的代碼常侣,寫成一個(gè)方法蜡饵,下次用到的時(shí)候直接調(diào)用就可以啦。
3.2.1 代碼語句:
public static void main(String[] args) {
// 1. 獲取手機(jī)號(hào)碼和幸運(yùn)手機(jī)號(hào)碼數(shù)量
Scanner input = new Scanner(System.in);
// 1.1 獲取手機(jī)號(hào)碼
System.out.println("請(qǐng)輸入?yún)⒓踊顒?dòng)的手機(jī)號(hào)碼:");
String phoneStr = input.next();
// 1.2 獲取幸運(yùn)手機(jī)號(hào)碼的數(shù)量
System.out.println("請(qǐng)輸入產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的數(shù)量:");
int n = input.nextInt();
// 1.3 對(duì)獲取手機(jī)號(hào)碼按照指定格式進(jìn)行切割
String[] phone = phoneStr.split(",");
// 2. 調(diào)用方法
String[] luckPhone = luck(n, phone);
// 3. 輸出幸運(yùn)手機(jī)號(hào)碼
System.out.println("參加游戲的手機(jī)號(hào)碼有:" + phoneStr);
System.out.println("產(chǎn)生的幸運(yùn)手機(jī)號(hào)碼為:" + Arrays.toString(luckPhone));
}
// 從傳入的若干個(gè)手機(jī)號(hào)碼中胳施,選中n個(gè)幸運(yùn)手機(jī)號(hào)溯祸,并返回
public static String[] luck(int n, String[] phone) {
int len = phone.length;
// 1. 檢查幸運(yùn)手機(jī)號(hào)嗎數(shù)量是否超出數(shù)組長度
if (n > len) {
return null;
}
// 2. 產(chǎn)生幸運(yùn)手機(jī)號(hào)碼數(shù)組
String[] luckPhone = new String[n];
// 3. 產(chǎn)生隨機(jī)數(shù)的Random類的對(duì)象rand
Random rand = new Random();
// 4. 產(chǎn)生幸運(yùn)手機(jī)號(hào)碼
for (int i = 0; i < n; i++) {
// 4.1 產(chǎn)生一個(gè)隨機(jī)下標(biāo)
int index = rand.nextInt(len);
// 4.2 檢查該下標(biāo) 中手機(jī)號(hào)是否為null,如果為null重新產(chǎn)生隨機(jī)下標(biāo)
if (phone[index] == null) {
i--;
continue;// 退出本次循環(huán)舞肆,繼續(xù)執(zhí)行下一次循環(huán)
}
luckPhone[i] = phone[index];
phone[index] = null;// 賦值為null
}
return luckPhone;
}
3.2.2 代碼結(jié)果:
請(qǐng)輸入?yún)⒓踊顒?dòng)的手機(jī)號(hào)碼:
133,131,153,180,177,130,181
請(qǐng)輸入產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的數(shù)量:
3
參加游戲的手機(jī)號(hào)碼有:133,131,153,180,177,130,181
產(chǎn)生的幸運(yùn)手機(jī)號(hào)碼為:[133, 181, 180]
請(qǐng)輸入?yún)⒓踊顒?dòng)的手機(jī)號(hào)碼:
133,131,153,180,177,130,181
請(qǐng)輸入產(chǎn)生幸運(yùn)手機(jī)號(hào)碼的數(shù)量:
10
參加游戲的手機(jī)號(hào)碼有:133,131,153,180,177,130,181
產(chǎn)生的幸運(yùn)手機(jī)號(hào)碼為:null