你好,很高興回答你的問題。
我覺得有兩個辦法吧。
一,找不面試演算法的公司。
二,在面試前多准備准備,刷一刷演算法題。
如果有幫助到你,請點擊採納。
⑵ 昨天去阿裡面試,上來就出了一個演算法題,當時沒想出思路,現在也仍沒有思路,大家來看一下此題。
我覺得這個問題帶有更多的數學成分.
雖然我也不會證明,但是直覺感覺沒有什麼最優構造,也許可以考慮用一下蟻群演算法這類的非精確演算法來求得一個較優解.
----
剛才稍微嘗試了一下,似乎兩個三叉路口(既是你配圖那種結構)都是120°正三叉的情況非常優,正在考慮能不能證明這是最優解.
⑶ 如何回答面試演算法問題
給定一個有序數組xxx 中,"有序"是否可以利用?
a: 用幾個簡單的測試用例,檢驗一下
b:暴力解法 通常都是思考的起點.
a: 遍歷常見的演算法思路
b: 遍歷常見的數據結構
c: 空間和時間的交換?
d: 預處理數據 => 排序
e: 在瓶頸處找到答案
a: 極端條件判斷
數組為空? 字元串==null? 數字==0? 指針->null?
b: 變數名等 符合規范
c: 注重模塊化,復用性
演算法在1s之內 可解決的問題:
O(n^2) 的演算法可處理大約10^4級別的數據
O(n) 的演算法可處理大約10^8級別的數據
O(nlogn)的演算法可處理大約10^7級別的數據
⑷ 程序員面試時筆試題沒寫好,是不是一定沒戲演算法題寫錯了,是不是一定沒戲了
不一定。不過如果筆試題成績不高的話,一般在安排面試上,可能順序比較靠後一些。一般情況下,第二輪的面試順序是由第一輪的筆試成績,由高到低安排的。有的時候面試時,面試官可能會對筆試時,面試者在某些題目的回答進行提問。
⑸ 位元組二面演算法高級難度沒寫出來,會掛嗎
位元組二面演算法高級難度沒鋒仔寫出來會掛。演算法題難度比較高友派,位元組是銀告汪演算法題寫出來不一定過,但寫不出來就肯定會掛。
⑹ 面試時遇到不會做的演算法題怎麼辦
按自己的想法做了,錯了也要完成哦
⑺ 演算法怎麼就這么難
廣大碼農同學們大多都有個共識,認為演算法是個硬骨頭,很難啃,悲劇的是啃完了還未必有用——除了面試的時候。實際工程中一般都是用現成的模塊,一般只需了解演算法的目的和時空復雜度即可。
不過話說回來,面試的時候面演算法,包括面項目中幾乎不大可能用到的演算法,其實並不能說是毫無道理的。演算法往往是對學習和理解能力的一塊試金石,難的都能掌握,往往容易的事情不在話下。志於高者得於中。反之則不成立。另一方面,雖說教科書演算法大多數都是那些即便用到也是直接拿模塊用的,但不幸的是,我們這群搬磚頭的有時候還非得做些發明家的事情:要麼是得把演算法當白盒加以改進以滿足手頭的特定需求;要麼乾脆就是要發明輪子。所以,雖說面試的演算法本身未必用得到,但熟悉各種演算法的人通常更可能熟悉演算法的思想,從而更可能具備這里說的兩種能力。
那麼,為什麼說演算法很難呢?這個問題只有兩種可能的原因:
演算法本身就很難。也就是說,演算法這個東西對於人類的大腦來說本身就是個困難的事兒。
講得太爛。
下面會說明,演算法之所以被絕大多數人認為很難,以上兩個原因兼具。
我們說演算法難的時候,有兩種情況:一種是學演算法難。第二種是設計演算法難。對於前者,大多數人(至少我當年如此)學習演算法幾乎是在背演算法,就跟背菜譜似的(「Cookbook」是深受廣大碼農喜愛的一類書),然而演算法和菜譜的區別在於,演算法包含的細節復雜度是菜譜的無數倍,演算法的問題描述千變萬化,邏輯過程百轉千回,往往看得人愁腸百結,而相較之下任何菜譜涉及到的基本元素也就那麼些(所以程序員肯定都具有成為好廚師的潛力:D)注意,即便你看了演算法的證明,某種程度上還是「背」(為什麼這么說,後面會詳述)。我自己遇到新演算法基本是會看證明的,但是發現沒多久還是會忘掉,這是死記硬背的標准症狀。如果你也啃過演算法書,我相信很大可能性你會有同感:為什麼當時明明懂了,但沒多久就忘掉了呢?為什麼當時明明非常理解其證明,但沒過多久想要自己去證明時卻發現怎麼都沒法補上證明中缺失的一環呢?
初中學習幾何證明的時候,你會不會傻到去背一個定理的證明?不會。你只會背結論。為什麼?一方面,因為證明過程包含大量的細節。另一方面,證明的過程環環相扣,往往只需要注意其中關鍵的一兩步,便能夠自行推導出來。演算法邏輯描述就好比定理,演算法的證明的過程就好比定理的證明過程。但不幸的是,與數學裡面大量簡潔的基本結論不同,演算法這個「結論」可不是那麼好背的,許多時候,演算法本身的邏輯就幾乎包含了與其證明過程等同的信息量,甚至演算法邏輯本身就是證明過程(隨便翻開一本經典的演算法書,看幾個經典的教科書演算法,你會發現演算法邏輯和演算法證明的聯系有多緊密)。於是我們又回到剛才那個問題:你會去背數學證明么?既然沒人會傻到去背整個證明,又為什麼要生硬地去背演算法呢?
那麼,不背就不背,去理解演算法的證明如何?理解了演算法的證明過程,便更有可能記住演算法的邏輯細節,理解記憶嘛。然而,仍然不幸的是,絕大多數演算法書在這方面做的實在糟糕,證明倒是給全了,邏輯也倒是挺嚴謹的,可是似乎沒有作者能真正還原演算法發明者本身如何得到演算法以及演算法證明的思維過程,按理說,證明的過程應該反映了這個思維過程,但是在下文關於霍夫曼編碼的例子中你會看到,其實飽受贊譽的CLRS和《Algorithms》不僅沒能還原這個過程,反而掩蓋了這個過程。
必須說明的是,沒有哪位作者是故意這樣做的,但任何人在講解一個自己已經理解了的東西的時候,往往會無意識地對自己的講解進行「線性化」,例如證明題,如果你回憶一下高中做平面幾何證明題的經歷,就會意識到,其實證明的過程是一個充滿了試錯,聯想,反推,特例,修改問題條件,窮舉等等一干「非線性」思維的,混亂不堪的過程,而並不像寫在課本上那樣——引理1,引理2,定理1,定理2,一口氣直到最終結論。這樣的證明過程也許容易理解,但絕對不容易記憶。過幾天你就會忘記其中一個或幾個引理,其中的一步或幾步關鍵的手法,然後當你想要回過頭來自己試著去證明的時候,就會發現卡在某個關鍵的地方,為什麼會這樣?因為證明當中並沒有告訴你為什麼作者當時會想到證明演算法需要那麼一個引理或手法,所以,雖說看完證明之後,對演算法這個結論而言你是知其所以然了,但對於演算法的證明過程你卻還沒知其所以然。在我們大腦的記憶系統當中,新的知識必須要和既有的知識建立聯系,才容易被回憶起來(《如何有效地學習與記憶》),聯系越多,越容易回憶,而一個天外飛仙似地引理,和我們既有的知識沒有半毛錢聯系,沒娘的孩子沒人疼,自然容易被遺忘。(為什麼還原思維過程如此困難呢?我曾經在知其所以然(一)里詳述)
正因為絕大多數演算法書上悲劇的演算法證明過程,很多人發現證明本身也不好記,於是寧可選擇直接記結論。當年我在數學系,考試會考證明過程,但似乎計算機系的考試考演算法證明過程就是荒謬的?作為「工程」性質的程序設計,似乎更注重使用和結果。但是如果是你需要在項目中自己設計一個演算法呢?這種時候最起碼需要做的就是證明演算法的正確性吧。我們面試的時候往往都會遇到一些演算法設計問題,我總是會讓應聘者去證明演算法的正確性,因為即便是一個「看上去」正確的演算法,真正需要證明起來往往發現並不是那麼容易。
所以說,絕大多數演算法書在作為培養演算法設計者的角度來說是失敗的,比數學教育更失敗。大多數人學完了初中平面幾何都會做證明題(數學書不會要求你記住幾何所有的定理),但很多人看完了一本演算法書還是一團漿糊,不會證明一些起碼的演算法,我們背了一坨又一坨結論,非但這些結論許多根本用不上,就連用上的那些也不會證明。為什麼會出現這樣的差異?因為數學教育的理想目的是為了讓你成為能夠發現新定理的科學家,而碼農系的演算法教育的目的卻更現實,是為了讓你成為能夠使用演算法做事情的工程師。然而,事情真的如此簡單么?如果真是這樣的話乾脆連演算法結論都不要背了,只要知道演算法做的是什麼事情,時空復雜度各是多少即可。
如果說以上提到的演算法難度(講解和記憶的難度)屬於Accidental Complexity的話,演算法的另一個難處便是Essential Complexity了:演算法設計。還是拿數學證明來類比(如果你看過《Introction to Algorithms:A Creative Approach》就知道演算法和數學證明是多麼類似。),與單單只需證明相比,設計演算法的難處在於,定理和證明都需要你去探索,尤其是前者——你需要去自行發現關鍵的那(幾)個定理,跟證明已知結論相比(已經確定知道結論是正確的了,你只需要用邏輯來連接結論和條件),這件事情的復雜度往往又難上一個數量級。
一個有趣的事實是,演算法的探索過程往往蘊含演算法的證明過程,理想的演算法書應該通過還原演算法的探索過程,從而讓讀者不僅能夠自行推導出證明過程,同時還能夠具備探索新演算法的能力。之所以這么說,皆因為我是個懶人,懶人總夢想學點東西能夠實現以下兩個目的:
一勞永逸:程序員都知道「一次編寫到處運行」的好處,多省事啊。學了就忘,忘了又得學,翻來覆去浪費生命。為什麼不能看了一遍就再也不會忘掉呢?到底是教的不好,還是學得不好?
事半功倍:事實上,程序員不僅講究一次編寫到處運行,更講究「一次編寫到處使用」(也就是俗稱的「復用」)。如果學一個演算法所得到的經驗可以到處使用,學一當十,推而廣之,時間的利用效率便會大大提高。究竟怎樣學習,才能夠使得經驗的外推(extrapolate)效率達到最大呢?
想要做到這兩點就必須盡量從知識樹的「根節點」入手,雖然這是一個美夢,例如數學界尋找「根節點」的美夢由來已久(《跟波利亞學解題》的「一點歷史」小節),但哥德爾一個證明就讓美夢成了泡影(《永恆的金色對角線》));但是,這並不阻止我們去尋找更高層的節點——更具普適性的解題原則和方法。所以,理想的演算法書或者演算法講解應該是從最具一般性的思維法則開始,順理成章地推導出演算法,這個過程應該盡量還原一個」普通人「思考的過程,而不是讓人看了之後覺得」這怎麼可能想到呢?
以本文上篇提到的霍夫曼編碼為例,第一遍看霍夫曼編碼的時候是在本科,只看了演算法描述,覺得挺直觀的,過了兩年,忘了,因為不知道為什麼要把兩個節點的頻率加在一起看做單個節點——一件事情不知道「為什麼」就會記不牢,知道了「為什麼」的話便給這件事情提供了必然性。不知道「為什麼」這件事情便可此可彼,我們的大腦對於可此可彼的事情經常會弄混,它更容易記住有理有據的事情(從資訊理論的角度來說,一件必然的事情概率為1,信息量為0,而一件可此可彼的事情信息量則是大於0的)。第二遍看是在工作之後,終於知道要看證明了,拿出著名的《Algorithms》來看,邊看邊點頭,覺得講得真好,一看就理解了為什麼要那樣來構造最優編碼樹。可是沒多久,又給忘了!這次忘了倒不是忘了要把兩個節點的頻率加起來算一個,而是忘了為什麼要這么做,因為當時沒有弄清霍夫曼為什麼能夠想到為什麼應該那樣來構造最優編碼樹。結果只知其一不知其二。
必須說明的是,如果只關心演算法的結論(即演算法邏輯),那麼理解演算法的證明就夠了,光背演算法邏輯難記住,理解了證明會容易記憶得多。但如果也想不忘演算法的證明,那麼不僅要理解證明,還要理解證明背後的思維,也就是為什麼背後的為什麼。後者一般很難在書和資料上找到,唯有自己多加揣摩。為什麼要費這個神?只要不會忘記結論不就結了嗎?取決於你想做什麼,如果你想真正弄清演算法設計背後的思想,不去揣摩演算法原作者是怎麼想出來的是不行的。
⑻ 面試難點!常用演算法技巧之「滑動窗口」
滑動窗口,顧名思義,就是有一個大小可變的窗口,左右兩端方向一致的向前滑動(右端固定,左端滑動;左端固定,右端滑動)。
可以想像成隊列,一端在push元素,另一端在pop元素,如下所示:
假設有數組[a b c d e f g h]
一個大小為3的滑動窗口在其上滑動,則有:
1、單層循環
2、雙層循環
模板只是一個解題思路,具體的題目可能需要具體分析,但是大體框架是不變的。
記住: 多刷題,多總結,是王道
1、最長不含重復字元的子字元串
2、絕對差不超過限制的最長連續子數組
3、無重復字元的最長子串
4、替換後的最長重復字元
滑動窗口演算法就是用以解決數組/字元串的子元素問題
滑動窗口演算法可以將嵌套的for循環問題,轉換為單循環問題,降低時間復雜度
生命不止堅毅魚奮斗,有夢想才是有意義的追求
給大家推薦一個免費的學習交流群:
最後,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峰。
java開發交流君樣:756584822
⑼ 本人目前在找java開發工作,每次收到面試邀請,去面試都要做筆試題,筆試是我的通病,演算法不會。
買數據結構、演算法(Algorithm)、演算法導論一類的書看,仔細做書上的題
重點復習鏈表、隊列、堆棧的操作、二叉樹的各種常見演算法、主要排序演算法、圖論最短距離問題、字元串的各種操作、時間復雜度的計算等
⑽ 面試遇到演算法題怎麼辦,都不會
科班出身還是半路出家?半路出家就選別這類崗位。
計算機科學專業的基礎,外加演算法競賽相關的培訓和實戰,不算基礎,培訓過程也至少要耗去一兩年,所以要算能不能和值不值。真正需要演算法能力高超的崗位薪水好,但是,少之又少,競爭慘烈,985本專業畢業生能搶上的都屬於鳳毛麟角。