【Java每日編程小練習(xí) 2021-01-21】 幸運(yùn)手機(jī)號(hào)的簡單產(chǎn)生

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末焦辅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子椿胯,更是在濱河造成了極大的恐慌筷登,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哩盲,死亡現(xiàn)場離奇詭異前方,居然都是意外死亡狈醉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門惠险,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苗傅,“玉大人,你說我怎么就攤上這事班巩≡剑” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵趣竣,是天一觀的道長摇庙。 經(jīng)常有香客問我旱物,道長遥缕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任宵呛,我火速辦了婚禮单匣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宝穗。我一直安慰自己户秤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布逮矛。 她就那樣靜靜地躺著鸡号,像睡著了一般。 火紅的嫁衣襯著肌膚如雪须鼎。 梳的紋絲不亂的頭發(fā)上鲸伴,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音晋控,去河邊找鬼汞窗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赡译,可吹牛的內(nèi)容都是我干的仲吏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼蝌焚,長吁一口氣:“原來是場噩夢啊……” “哼裹唆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起只洒,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤许帐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后红碑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舞吭,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泡垃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了羡鸥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔑穴。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惧浴,靈堂內(nèi)的尸體忽然破棺而出存和,到底是詐尸還是另有隱情,我是刑警寧澤衷旅,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布捐腿,位于F島的核電站,受9級(jí)特大地震影響柿顶,放射性物質(zhì)發(fā)生泄漏茄袖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一嘁锯、第九天 我趴在偏房一處隱蔽的房頂上張望宪祥。 院中可真熱鬧,春花似錦家乘、人聲如沸蝗羊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耀找。三九已至,卻和暖如春业崖,著一層夾襖步出監(jiān)牢的瞬間野芒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工腻要, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留复罐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓雄家,卻偏偏與公主長得像效诅,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趟济,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 網(wǎng)絡(luò)編程 網(wǎng)絡(luò)編程對(duì)于很多的初學(xué)者來說乱投,都是很向往的一種編程技能,但是很多的初學(xué)者卻因?yàn)楹荛L一段時(shí)間無法進(jìn)入網(wǎng)絡(luò)編...
    程序員歐陽閱讀 2,014評(píng)論 1 37
  • 計(jì)算機(jī)網(wǎng)絡(luò)概述 網(wǎng)絡(luò)編程的實(shí)質(zhì)就是兩個(gè)(或多個(gè))設(shè)備(例如計(jì)算機(jī))之間的數(shù)據(jù)傳輸顷编。 按照計(jì)算機(jī)網(wǎng)絡(luò)的定義戚炫,通過一定...
    蛋炒飯_By閱讀 1,227評(píng)論 0 10
  • 今天老板突發(fā)奇想說要把用戶手機(jī)號(hào)碼加密(反正我身邊的程序員朋友都覺得挺沒必要的)双肤。然后我一尋思施掏,md5?或者各種封...
    唯有努力不欺人丶閱讀 994評(píng)論 0 5
  • 閱讀文本大概需要 8 分鐘茅糜。 目標(biāo)場景 平時(shí)在工作過程中七芭,偶爾會(huì)需要大量的 手機(jī)號(hào)碼,去測試一些具體的業(yè)務(wù)功能蔑赘,為...
    AirPython閱讀 5,109評(píng)論 0 5
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)狸驳、焦點(diǎn)、注意力缩赛、語言聯(lián)想耙箍、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會(huì)...
    Jenaral閱讀 5,721評(píng)論 0 5