ARTS第三周(2018-12-16)

極客時(shí)間《左耳聽風(fēng)》發(fā)起的ARTS挑戰(zhàn)怎么參加?
左耳朵耗子專欄《左耳聽風(fēng)》 用戶自發(fā)每周完成一個(gè)ARTS
非常抱歉,上周因?yàn)槭虑楸容^多赃磨,一直在加班,沒來及做寞埠,爭(zhēng)取補(bǔ)上
感謝耗子叔上次指出的問題

1.Algorithm:每周至少做一個(gè) leetcode 的算法題

第一道算法題:
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

3.無重復(fù)字符的最長(zhǎng)子串

自己看完題后的思路:
第一種,將所有的子串找出驳规,然后篩選出無重復(fù)字符的斥赋,然后再對(duì)比長(zhǎng)度
第二種,

字符串:ABCDECDEFGIF
A
AB
ABC
ABCD
ABCDE
ABCDEC  => ABCDE DEC  maxLength = 5;
DECD    => DEC ECD    maxLength = 5;
ECDE    => ECD CDE    maxLength = 5;
CDEF    
CDEFG
CDEFGI
CDEFGIF =>CDEFGI GIF  maxLength = 6; 

最開始的代碼:

public int lengthOfLongestSubstring(String s) {
        if(s.length()<=1){
            return s.length();
        }
        int maxLength = 0;
        Set<Character> set = new LinkedHashSet();
        Set<Character> tmpSet;
        int length = s.length();
        Boolean isEqual;
        for (int index =0 ;index<length;index++) {
            char c = s.charAt(index);
            if(!set.add(c)){
                maxLength = Math.max(maxLength,set.size());
                tmpSet = new LinkedHashSet();
                isEqual = false;
                for(char ch : set ){
                    if(ch==c){
                        isEqual = true;
                        continue;
                    }
                    if(isEqual){
                        tmpSet.add(ch);
                    }
                }
                tmpSet.add(c);
                set = tmpSet;
            }
        }
        maxLength = Math.max(maxLength,set.size());
        return maxLength;
    }

再細(xì)想一下氛琢,可以采用滑動(dòng)窗口的方式:

/**
 * 滑動(dòng)窗口方式:
 * [leftIndex,rightIndex]
 * 開始leftIndex不動(dòng)喊递,rightIndex往右移動(dòng),并將值添加到set中阳似。
 * 如果添加成功骚勘,次數(shù)計(jì)算 Math.max(maxLength,rightIndex-leftIndex),(注意:此時(shí)的rightIndex已經(jīng)++)撮奏。
 * 如果添加失敗调鲸,說明已經(jīng)存在,從leftIndex開始移除挽荡,直到添加再次成功,說明set重復(fù)值之前的數(shù)據(jù)已經(jīng)全部刪除即供。
 */
 public int lengthOfLongestSubstring1(String s) {
    int maxLength = 0;
    Set<Character> set = new HashSet();
    int length = s.length();
    for (int leftIndex = 0, rightIndex = 0 ;rightIndex< length && leftIndex<length;){//此處可以換成while
        if(set.add(s.charAt(rightIndex))){
            rightIndex++;
            maxLength = Math.max(maxLength,rightIndex-leftIndex);
        }else{
            set.remove(s.charAt(leftIndex++));
        }
    }
    return maxLength;
}

第二道算法題:
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/

4.尋找兩個(gè)有序數(shù)組的中位數(shù)

思路:將兩個(gè)數(shù)組合并排序定拟,到一半結(jié)束
問題:時(shí)間復(fù)雜度不是題目要求的 O(log(m + n))

/**
 * 支持 ,兩個(gè)都是正序逗嫡,兩個(gè)都是倒序青自,或者一個(gè)正序一個(gè)倒序
 * @param nums1
 * @param nums2
 * @return
 */
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    double result= 0d;
    if(nums1==null){
        nums1 = new int[]{};
    }
    if(nums2==null){
        nums2 = new int[]{};
    }
    if(nums1.length==0 && nums2.length==0){ // 處理兩個(gè)都是0的情況
        return result;
    }

    // 奇數(shù)/偶數(shù)  是否是奇數(shù)
    boolean isOdd = (nums1.length+nums2.length)%2 !=0;
    int medianIndex1 = isOdd ? (nums1.length+nums2.length)/2 : (nums1.length+nums2.length)/2 -1;
    int medianIndex2 = isOdd ? -1 : (nums1.length+nums2.length)/2;

    int[] nums3 = new int[isOdd ? medianIndex1+1 :medianIndex2+1];
    // 倒序,正序驱证?延窜?
    boolean nums1Asc = true;
    boolean nums2Asc = true;

    for(int i=0 ;i<nums1.length-1;i++){
        if(nums1[i]!=nums1[i+1]){
            nums1Asc = nums1[i] < nums1[i+1];
            break;
        }
    }
    for(int i=0 ;i<nums2.length-1;i++){
        if(nums2[i]!=nums2[i+1]){
            nums2Asc = nums2[i] < nums2[i+1];
            break;
        }
    }
    int i = nums1Asc ? 0 : nums1.length-1;
    int j = nums2Asc ? 0 : nums2.length-1;;
    int index =0;
    while ((nums1Asc ? i<nums1.length : i>=0) || (nums2Asc ? j<nums2.length : j>=0)){
        if((nums1Asc ? i<nums1.length : i>=0) && (nums2Asc ? j<nums2.length : j>=0)){
            if(nums1[i]<nums2[j]){
                nums3[index] = nums1[i];
                i = nums1Asc ? i+1 : i-1;
            }else{
                nums3[index] = nums2[j];
                j = nums2Asc ? j+1 : j-1;
            }
        }else if(nums1Asc ? i<nums1.length : i>0){
            nums3[index] = nums1[i];
            i = nums1Asc ? i+1 : i-1;
        }else if(nums2Asc ? j<nums2.length : j>0){
            nums3[index] = nums2[j];
            j = nums2Asc ? j+1 : j-1;
        }
        if(isOdd ){
            if(index == medianIndex1){
                break;
            }
        }else{
            if(index == medianIndex2){
                break;
            }
        }
        index++;
    }

    if(isOdd ){
        result = (double)nums3[nums3.length-1];
    }else{
        result = ((double)nums3[nums3.length-1]+(double)nums3[nums3.length-2])/2;
    }
    return result;
}

2.Review:閱讀并點(diǎn)評(píng)至少一篇英文技術(shù)文章

How to think like a programmer?—?lessons in problem solving

如何像程序員一樣思考問題-解決問題的經(jīng)驗(yàn)教訓(xùn)

從本質(zhì)上講, 這是解決問題的一種更有效的方法

一般解決問題的方式:

  1. 嘗試一個(gè)方案
  2. 如果方案不成功抹锄,嘗試另一個(gè)方案
  3. 如果還不起作用逆瑞,重復(fù)步驟2,直到解決

運(yùn)氣好可以解決伙单,運(yùn)氣不好获高,可能浪費(fèi)很多時(shí)間也沒有解決

推薦的方法:

  1. 首先得有一個(gè)框架
  2. 多實(shí)踐
Almost all employers prioritize problem-solving skills first.
Problem-solving skills are almost unanimously the most important qualification that employers look for….more than programming languages proficiency, debugging, and system design.

幾乎所有雇主都首先優(yōu)先考慮解決問題的技能。
解決問題的技能幾乎是雇主尋求的最重要的資格...不僅僅是編程語言的熟練程度吻育,調(diào)試和系統(tǒng)設(shè)計(jì)

一念秧、框架
作者建議:"The 4-Hour Chef"

“The biggest mistake I see new programmers make is focusing on learning syntax instead of learning how to solve problems.”?—?V. Anton Spraul

我看到新程序員犯下的最大錯(cuò)誤就是專注于學(xué)習(xí)語法,而不是學(xué)習(xí)如何解決問題布疼。

遇到新問題時(shí)應(yīng)該怎么做摊趾?

  1. 理解
    首先你的理解問題币狠,才能很好的解決問題。
    怎么算理解呢砾层?引用一下:
“If you can’t explain something in simple terms, you don’t understand it.”?—?Richard Feynman

如果你不能用簡(jiǎn)短的文字描述一件事情漩绵,那么不算理解它。

  1. 制定計(jì)劃

處理問題是一定要花時(shí)間先去理解問題梢为,分析問題渐行,然后制定執(zhí)行計(jì)劃。有了計(jì)劃再去執(zhí)行铸董。

  1. 拆解問題

不要試圖去一下解決一個(gè)大問題祟印。
應(yīng)該將大問題拆解成一個(gè)個(gè)的小問題,甚至可以把小問題繼續(xù)拆解粟害。
然后蕴忆,從解決拆解后的小問題開始處理。
當(dāng)所有小問題解決后悲幅,把小問題串聯(lián)起來套鹅,大問題自然就解決了。

將問題減少到知道如何解決問題并編寫解決方案的程度汰具。

二卓鹿、堅(jiān)持了嗎?

解決小問題試留荔,遇到問題吟孙,卡住了,怎么辦聚蝶?

  1. 調(diào)試
  2. 重新評(píng)估杰妓,是不是換另一中思路(有時(shí)我們會(huì)在問題的細(xì)節(jié)上迷失方向,而忽略了在更一般的層面上解決問題的一般原則)
  3. 研究碘勉,比如巷挥,谷歌等

三、實(shí)踐

不要期望短時(shí)間內(nèi)就會(huì)有一個(gè)很好的改變验靡。
如果你想成為一個(gè)好的問題解決者倍宾,你需要不斷的去解決問題。
當(dāng)然晴叨,解決的問題有很多:國際象棋謎題凿宾,數(shù)學(xué)問題,數(shù)獨(dú)兼蕊,圍棋初厚,大富翁,視頻游戲,密碼等等

事實(shí)上产禾,成功人士的共同模式是他們練習(xí)“解決微觀問題”的習(xí)慣排作。

3.Tip:學(xué)習(xí)至少一個(gè)技術(shù)技巧

uptime

11:07  up 5 days, 19:58, 5 users, load averages: 2.90 2.96 2.76

顯示內(nèi)容說明:

11:07   # 系統(tǒng)當(dāng)前時(shí)間
up 5 days, 19:58   # 系統(tǒng)已運(yùn)行時(shí)間
5 users  # 登錄用戶數(shù)
load averages: 2.90 2.96 2.76  # 系統(tǒng)平均負(fù)載,統(tǒng)計(jì)最近1亚情,5妄痪,15分鐘的系統(tǒng)平均負(fù)載

平均負(fù)載:是指單位時(shí)間內(nèi),系統(tǒng)處于可運(yùn)行狀態(tài)下和不可中斷狀態(tài)的平均進(jìn)程數(shù)楞件,也就是平均活躍進(jìn)程數(shù)衫生,它和CPU使用率沒有直接關(guān)系。

4.Share:分享一篇有觀點(diǎn)和思考的技術(shù)文章

創(chuàng)業(yè)公司需要基礎(chǔ)架構(gòu)團(tuán)隊(duì)嗎土浸?

個(gè)人剛經(jīng)歷的一個(gè)創(chuàng)業(yè)公司罪针,公司成立已經(jīng)快一年了,有一個(gè)后臺(tái)的統(tǒng)計(jì)程序黄伊,所有邏輯全部用sql寫到了controller中泪酱。
因?yàn)橹皼]經(jīng)歷過創(chuàng)業(yè)公司,所以不清楚這樣做是不是對(duì)还最。
歡迎同學(xué)給建議墓阀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拓轻,隨后出現(xiàn)的幾起案子斯撮,更是在濱河造成了極大的恐慌,老刑警劉巖扶叉,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吮成,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡辜梳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門泳叠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來作瞄,“玉大人,你說我怎么就攤上這事危纫∽诨樱” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵种蝶,是天一觀的道長(zhǎng)契耿。 經(jīng)常有香客問我,道長(zhǎng)螃征,這世上最難降的妖魔是什么搪桂? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上踢械,老公的妹妹穿的比我還像新娘酗电。我一直安慰自己,他們只是感情好内列,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布撵术。 她就那樣靜靜地躺著,像睡著了一般话瞧。 火紅的嫁衣襯著肌膚如雪嫩与。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天交排,我揣著相機(jī)與錄音划滋,去河邊找鬼。 笑死个粱,一個(gè)胖子當(dāng)著我的面吹牛古毛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播都许,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼稻薇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了胶征?” 一聲冷哼從身側(cè)響起塞椎,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睛低,沒想到半個(gè)月后案狠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钱雷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年骂铁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罩抗。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拉庵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出套蒂,到底是詐尸還是另有隱情钞支,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布操刀,位于F島的核電站烁挟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏骨坑。R本人自食惡果不足惜撼嗓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧静稻,春花似錦警没、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至押搪,卻和暖如春树酪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背大州。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工续语, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厦画。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓疮茄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親根暑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子力试,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

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