編程馬拉松 Day01 面試題小記

打算從今天起開始每日一練唧垦,鞏固一下算法捅儒,數(shù)據(jù)結(jié)構(gòu)相關(guān)的知識,廢話少說振亮,開始看題巧还。

題目

以上是我近期面試中遇到的一些題,其中1坊秸,3題出自百度系面試官麸祷;2,4出自Uber系面試官妇斤。

兩個(gè)水杯倒出3L水的問題

先來看第一個(gè)問題摇锋,題干是要求倒騰出3L的水丹拯。我們可以從4、5兩個(gè)數(shù)字入手荸恕,觀察通過怎樣的方式能夠得到3乖酬,得到以下兩種情況

  • 4 * 2 -5 == 3
  • ( 5 - 4 ) * 3 == 3

轉(zhuǎn)換為文字

  1. 第一種方式
    • 先將4L的杯子接滿水,全部倒入到5L的杯子中(tips:此時(shí)4L的杯子為空融求,5L的杯子中裝載了4L水咬像,還能再倒入1L)
    • 再將4L的杯子接滿水,然后向5L的杯子倒水生宛,當(dāng)5L杯子倒?jié)M時(shí)县昂,4L杯子剩下3L水
  2. 第二種方式
    • 將5L的杯子接滿水,倒入4L的杯子中(tips: 此時(shí)5L的杯子剩下1L水)陷舅,然后將4L杯子的水全部倒掉倒彰,再將5L杯子剩余的1L水倒入4L的杯子(tips: 此時(shí)4L杯子有1L水)
    • 將5L的杯子接滿水,倒入4L的杯子中(tips: 由于上一輪4L杯子已存在1L水莱睁,本次5L杯最多只能倒出3L水待讳,倒出后5L杯剩余2L水),然后將4L杯子的水全部的倒掉仰剿,再將5L杯子剩余的2L水倒入到4L的杯子(tips: 此時(shí)4L杯子有2L水)
    • 將5L的杯子接滿水创淡,倒入4L的杯子中(tips: 由于上一輪4L杯子已存在2L水,本次5L杯最多只能倒出2L水南吮,倒出后5L杯正好剩余3L水)

大數(shù)四則運(yùn)算

第二個(gè)問題是一個(gè)典型的大數(shù)運(yùn)算問題琳彩。編程中有時(shí)會(huì)遇到數(shù)字上溢(tips: 如數(shù)值的大小超過了Long型可表示的最大數(shù))的問題,此時(shí)便需要采用字符串替換原有的數(shù)值計(jì)算部凑。

以10進(jìn)制加法為例露乏,解決思路如下:

  1. 使用字符串裝載參與計(jì)算的兩個(gè)數(shù)值
  2. 分別取兩個(gè)字符串的末尾數(shù)值 a和b,進(jìn)行相加計(jì)算 sum = a+b 砚尽,如結(jié)果sum大于9施无,則設(shè)置進(jìn)位標(biāo)志 flag = 1;否則設(shè)置 flag = 0必孤。記錄sum%10猾骡,表示當(dāng)前位的結(jié)果
  3. 再次取兩個(gè)字符串的次末尾數(shù)值 a和b,進(jìn)行相加計(jì)算 sum = a+b+flag 敷搪,如結(jié)果sum大于9兴想,則設(shè)置進(jìn)位標(biāo)志 flag = 1;否則設(shè)置 flag = 0赡勘。記錄sum%10嫂便,表示當(dāng)前位的結(jié)果
    ...
  4. 重復(fù)以上步驟,若兩個(gè)數(shù)字字符串的長度不一致闸与,則當(dāng)其中較短字符串s1遍歷完成后毙替,只遍歷另一個(gè)字符串s2岸售,每次取出s2的末位數(shù)值與flag相加,得到新的進(jìn)制標(biāo)志和當(dāng)前位的結(jié)果厂画。

代碼如下:

public static String bigSumAdd(String s1, String s2) {
        StringBuilder stringBuilder = new StringBuilder();//字符串構(gòu)造器
        int flag = 0;//初始化進(jìn)位標(biāo)志
        //判定操作數(shù)長度大小
        String longer = s1.length() > s2.length() ? s1 : s2;
        String shorter = s1.length() > s2.length() ? s2 : s1;
        for (int i = 1; i <= longer.length(); i++) {
            int last1 = longer.length() - i ;//取longger最后一位的索引值
            int last2 = shorter.length() - i ;//取shorter最后一位的索引值
            int currentLonger = (int) longer.charAt(last1);
            if (i < shorter.length()) {
                int currentShorter = (int) shorter.charAt(last2);
                //每次charAt()取出的只是char型變量 '1'~'9',需減去'0'方可得到數(shù)字1~9凸丸。
                int sum = (currentShorter - '0') + (currentLonger - '0') + flag;
                flag = sum > 9 ? 1 : 0;//設(shè)置進(jìn)位標(biāo)志flag
                stringBuilder.append(sum % 10);//將當(dāng)前位結(jié)果append到stringBuilder中
            } else {
                int sum = currentLonger - '0' + flag;
                flag = sum > 9 ? 1 : 0;
                stringBuilder.append(sum % 10);
            }
        }
        //反轉(zhuǎn)字符串,輸出
        return stringBuilder.reverse().toString();
}

字符串去重

這道題比較簡單袱院,有多種方法屎慢。

先排序再去重,時(shí)間復(fù)雜度 O(N*LogN)

public static String deDuplicate(String str) {
    char strArr[] = str.toCharArray();//將字符串能轉(zhuǎn)化為字符數(shù)組
    Arrays.sort(strArr);//將字符數(shù)組排序
    char pre = strArr[0];//取字符數(shù)組首位字符
    StringBuffer stringBuffer = new StringBuffer();
    stringBuffer.append(pre);//添加到緩沖中
    for (int i = 1; i < strArr.length; i++) {
        char current = strArr[i];
        if (current == pre) {//判斷當(dāng)前字符與之前字符是否一致忽洛,若一致則跳過此次循環(huán)
            continue;
        }
        stringBuffer.append(current);//否則將當(dāng)前字符添加到緩沖中
        pre = current;//將當(dāng)前字符賦值于pre
    }
    //輸出
    return stringBuffer.toString();
}

采用輔助空間腻惠,時(shí)間復(fù)雜度 O(N),空間復(fù)雜度與字符串編碼集相關(guān)

public static String deDuplicate2(String str) {
    int help[] = new int[65536];//65536即2^16,可對應(yīng)2個(gè)字節(jié)以內(nèi)的任意字符
    StringBuffer stringBuffer = new StringBuffer();
    for (int i = 0; i < str.length(); i++) {
        char current = str.charAt(i);//去當(dāng)前字符
        if (help[current] != 0) {//若當(dāng)前字符已存在欲虚,則跳過本次循環(huán)
            continue;
        } else {
            help[current]++;//否則將當(dāng)前字符對應(yīng)的位置位非0
            stringBuffer.append(current);//添加到緩沖中
        }
    }
    //輸出
    return stringBuffer.toString();
}

楊輝三角

這道題是一個(gè)三角問題集灌,觀察三角構(gòu)型,得到如下現(xiàn)象:

  1. 從第一行到第五行苍在,每行依次有1绝页,2,3寂恬,4,5個(gè)數(shù)字...
  2. n行的三角共有 1+2+..+n-1+n 個(gè)數(shù)字
  3. 每一行的首位及末位數(shù)字均為'1'莱没,中間數(shù)字為正上方左右兩個(gè)數(shù)字的和初肉。

若用一維數(shù)組存儲(chǔ)三角中的所有數(shù)字,從上到下饰躲,從左到右開始索引牙咏,則從第i行,索引值為index的數(shù)值 arr[index] = arr[index - i] + arr[index-i-1]嘹裂,代碼如下:

/**
 * 打印楊輝三角
 * @param n 表示楊輝三角的行數(shù)
 */
public static void yanhuiTriangle(int n){
    int size = 0;
    //得到一維數(shù)組長度
    for (int i = 0; i <= n; i++) {
        size += i;
    }
    int arr[] = new int[size];//創(chuàng)建一維數(shù)組
    int index = 0;
    for (int i = 0; i < n; i++) {//外層循環(huán)妄壶,控制行
        for (int j = 0; j < n - i; j++) {
            System.out.print(" ");//打印數(shù)字之前的空格
        }
        for (int j = 0; j <= i; j++) {//內(nèi)存循環(huán),控制列
            if (j == 0 || j == i) {//每行的首位及末尾
                arr[index] = 1;
            } else {
                arr[index] = arr[index - i] + arr[index - i - 1];//中間位求值
            }
            System.out.print(arr[index] + " ");//打印數(shù)值
            index++;
        }
        System.out.println();
    }
}

總結(jié)

第一天的開胃菜到此結(jié)束寄狼,題目本身并不難丁寄,更多的是對編程思維的考察,今天先到這里泊愧,如有疑問歡迎與我聯(lián)系 :)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伊磺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子删咱,更是在濱河造成了極大的恐慌屑埋,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痰滋,死亡現(xiàn)場離奇詭異摘能,居然都是意外死亡续崖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門团搞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來严望,“玉大人,你說我怎么就攤上這事莺丑≈罚” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵梢莽,是天一觀的道長萧豆。 經(jīng)常有香客問我,道長昏名,這世上最難降的妖魔是什么涮雷? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮轻局,結(jié)果婚禮上洪鸭,老公的妹妹穿的比我還像新娘。我一直安慰自己仑扑,他們只是感情好览爵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镇饮,像睡著了一般蜓竹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上储藐,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天俱济,我揣著相機(jī)與錄音,去河邊找鬼钙勃。 笑死蛛碌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辖源。 我是一名探鬼主播蔚携,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼同木!你這毒婦竟也來了浮梢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彤路,失蹤者是張志新(化名)和其女友劉穎秕硝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡远豺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年奈偏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躯护。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惊来,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棺滞,到底是詐尸還是另有隱情裁蚁,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布继准,位于F島的核電站枉证,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏移必。R本人自食惡果不足惜室谚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崔泵。 院中可真熱鬧秒赤,春花似錦、人聲如沸憎瘸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幌甘。三九已至崎弃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間含潘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工线婚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遏弱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓塞弊,卻偏偏與公主長得像漱逸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子游沿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

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