面試 | Java 算法的 ACM 模式

前言

經(jīng)常在 LeetCode 上用核心代碼模式刷題的小伙伴突然用 ACM 模式可能會適應(yīng)不過來文兢,把時間花在輸入輸出上很浪費時間,因此本篇筆記對 Java 算法的 ACM 模式做了個小總結(jié);

除此之外抖所,需要注意一些小細節(jié):

  • 1. 數(shù)字讀取到字符串讀取間需要用 in.nextLine() 換行钙勃;

1. 數(shù)字處理

  • 如果是讀取 Long,則使用:in.hasNextLong()Long a = in.nextLong()究反;
  • 讀取小數(shù):f = scan.nextFloat()double weight = scan.nextDouble()寻定;

1.1 多組空格分隔的兩個正整數(shù)

輸入包括兩個正整數(shù)a,b(1 <= a, b <= 10^9),輸入數(shù)據(jù)包括多組;

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) { // 注意 while 處理多個 case
            int a = in.nextInt();
            int b = in.nextInt();
            //處理
        }
    }
}

1.2 第一行組數(shù)接空格分隔的兩個正整數(shù)

第一行輸入數(shù)據(jù)個數(shù)精耐,后面輸入數(shù)據(jù)狼速;

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int num = in.nextInt();
        for(int i = 0; i < num; i++) { // 注意 while 處理多個 case
            int a = in.nextInt();
            int b = in.nextInt();
            //處理
        }
    }
}

1.3 空格分隔的兩個正整數(shù)為0 0 結(jié)束

輸入包括兩個正整數(shù)a,b(1 <= a, b <= 10^9), 如果輸入為0 0則結(jié)束輸入;

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) { // 注意 while 處理多個 case
            int a = in.nextInt();
            int b = in.nextInt();
            if(a ==0 && b == 0) break;
            //處理
        }
    }
}

1.4 每行第一個為個數(shù)后帶空格分割整數(shù)為0結(jié)束

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) { // 注意 while 處理多個 case
            int n = in.nextInt();
            if(n == 0) break;
            int sum = 0;
            for (int i = 0; i < n; i++) {
                sum += in.nextInt();
            }
            System.out.println(sum);
        }
    }
}


2. 字符串處理

比較項 next( ) nextLine( )
說明 只能讀取到空格之前的字符串 可以讀取空格的字符串
比如“你好 java” “你好” “你好 java”
使用前判斷 in.hasNext() in.hasNextLine()

2.1 第一行個數(shù)第二行字符串

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        in.nextLine();
        while (in.hasNext()) { // 注意 while 處理多個 case
            String[] s = in.nextLine().split(" ");
            //處理
        }
    }
}

2.2 多行空格分開的字符串

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) { // 注意 while 處理多個 case
            String[] s = in.nextLine().split(" ");
            //處理
        }
    }
}


3. 輸出格式化相關(guān)

  • 輸出有兩種方式:String str=String.format(示例)System.out.printf(示例)卦停;
  • 向上取整用:Math.ceil(1.01)向胡,向下取整用:Math.floor(1.01)恼蓬;

3.1 轉(zhuǎn)換符

轉(zhuǎn)換符 說明 示例 輸出
%s 字符串 "Hi,%s:%s.%s", "王南","王力","王張" Hi,王南:王力.王張
%c 字符 "字母a的大寫是:%c %n", 'A' 字母a的大寫是:A
%b 布爾 "3>7的結(jié)果是:%b %n", 3>7 3>7的結(jié)果是:false
%d 整數(shù)(十進制) "100的一半是:%d %n", 100/2 100的一半是:50
%x 整數(shù)(十六進制) "100的16進制數(shù)是:%x %n", 100 100的16進制數(shù)是:64
%o 整數(shù)(八進制) "100的8進制數(shù)是:%o %n", 100 100的8進制數(shù)是:144
%f 浮點 "50元的書打8.5折扣是:%f 元%n", 50*0.85 50元的書打8.5折扣是:42.500000 元
%a 浮點(十六進制) "上面價格的16進制數(shù)是:%a %n", 50*0.85 上面價格的16進制數(shù)是:0x1.54p5
%e 指數(shù) "上面價格的指數(shù)表示:%e %n", 50*0.85 上面價格的指數(shù)表示:4.250000e+01
%g 通用浮點(f和e類型中較短的) "上面價格的指數(shù)和浮點數(shù)結(jié)果的長度較短的是:%g %n", 50*0.85 上面價格的指數(shù)和浮點數(shù)結(jié)果的長度較短的是:42.5000
%h 散列碼 "字母A的散列碼是:%h %n", 'A' 字母A的散列碼是:41
%% 百分比 "上面的折扣是%d%% %n", 85 上面的折扣是85%
%n 換行符
%tx 日期與時間

3.2 搭配轉(zhuǎn)換符的標(biāo)志

標(biāo)志 說明 示例 輸出
. 后接保留多少位小數(shù)(四舍五入) ("%.2f",3.555) 3.56
+ 為正數(shù)或者負數(shù)添加符號 ("%+d",15) +15
? 左對齊 ("%-5d",15) |15 |
0 數(shù)字前面補0 ("%04d", 99) 0099
空格 在整數(shù)之前添加指定數(shù)量的空格 ("% 4d", 99) | 99|
, 以“,”對數(shù)字分組 ("%,f", 9999.99) 9,999.990000
( 使用括號包含負數(shù) ("%(f", -99.99) (99.990000)
# 如果是浮點數(shù)則包含小數(shù)點,如果是16進制或8進制則添加0x或0 ("%#x", 99) ("%#o", 99) 0x63 0143
< 格式化前一個轉(zhuǎn)換符所描述的參數(shù) ("%f和<3.2f", 99.45) 99.450000和99.45
$ 被格式化的參數(shù)索引 ("%1$d,%2$s", 99,"abc") 99,abc


4. ACM 模式模板

public class Main {

    public static void main(String[] args) {
        //1.數(shù)據(jù)輸入
        Scanner in = new Scanner(System.in);
        //讀數(shù)字
        int numLen = in.nextInt();
        int[] numArr = new int[numLen];
        int i = 0;
        while(in.hasNextInt() && i < numLen){
            numArr[i] = in.nextInt();
            i++;
        }
        //讀字符串
        int strLen = in.nextInt();
        in.nextLine(); //數(shù)字到字符串要換行
        String[] strArr = new String[strLen];
        //或者 strArr[] = in.nextLine().split(" ");
        int j = 0;
        while(in.hasNextLine() && j < strLen){
            strArr[j] = in.nextLine();
            j++;
        }
        
        //2. 處理
        Solution solution = new Solution();
        String result = solution.process(numArr, strArr);
        
        //3. 輸出
        System.out.println(result);
        //四舍五入輸出小數(shù)
        String str = String.format("%.2f",3.555);
        System.out.println(str);
    }
}

//下面類似 LeetCode 的核心代碼模式
class Solution {
    public String process(int[] nums, String[] strs) {
        StringBuilder sb = new StringBuilder();
        sb.append(Arrays.toString(nums));
        sb.append(" && ");
        sb.append(Arrays.toString(strs));
        return sb.toString();
    }
}

最后

\color{blue}{\rm\small{新人制作僵芹,如有錯誤处硬,歡迎指出,感激不盡淮捆!}}

\color{blue}{\rm\small{歡迎關(guān)注我郁油,并與我交流!}}

\color{blue}{\rm\small{如需轉(zhuǎn)載攀痊,請標(biāo)注出處桐腌!}}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市苟径,隨后出現(xiàn)的幾起案子案站,更是在濱河造成了極大的恐慌,老刑警劉巖棘街,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蟆盐,死亡現(xiàn)場離奇詭異,居然都是意外死亡遭殉,警方通過查閱死者的電腦和手機石挂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來险污,“玉大人痹愚,你說我怎么就攤上這事』着矗” “怎么了拯腮?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蚁飒。 經(jīng)常有香客問我动壤,道長,這世上最難降的妖魔是什么淮逻? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任琼懊,我火速辦了婚禮,結(jié)果婚禮上爬早,老公的妹妹穿的比我還像新娘肩碟。我一直安慰自己,他們只是感情好凸椿,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翅溺,像睡著了一般脑漫。 火紅的嫁衣襯著肌膚如雪髓抑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天优幸,我揣著相機與錄音吨拍,去河邊找鬼。 笑死网杆,一個胖子當(dāng)著我的面吹牛羹饰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碳却,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼队秩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了昼浦?” 一聲冷哼從身側(cè)響起柔纵,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤倦沧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梧乘,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年默色,在試婚紗的時候發(fā)現(xiàn)自己被綠了谎势。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡虐沥,死狀恐怖熊经,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情置蜀,我是刑警寧澤奈搜,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站盯荤,受9級特大地震影響馋吗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秋秤,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一宏粤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灼卢,春花似錦绍哎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春海诲,著一層夾襖步出監(jiān)牢的瞬間繁莹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工特幔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咨演,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓蚯斯,卻偏偏與公主長得像薄风,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拍嵌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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