A. 大公司筆試面試有哪些經典演算法題目
1、二維數組中的查找
具體例題:如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為迴文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是迴文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是迴文序列。現在給出一個數字序列,允許使用一種轉換操作:選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。現在對於所給序列要求出最少需要多少次操作可以將其變成迴文序列?
B. 面試演算法題
定義一個函數實現數據類型的轉換
第一個元素是數據標識,第二個元素的數值必須大於等於50才返回,不夠50往後累加,加到最後如果不夠50也直接返回,因為沒有可加的數據了
例子1:
a = [[1,3],[2,51],[3,49],[4,42],[5,42]] #入參
a1 = [[2,54],[4,91],[5,42]] #返回
例子2:
b = [[1,50],[2,5],[3,10],[4,42],[5,42],[6,10]] #入參
b1 = [[1,50],[4,57],[6,52]] #返回
a = [[1, 3], [2, 51], [3, 49], [4, 42], [5, 42]]
li = []
n =0
for i, kin a:
n += k
if n >=50:
li.append([i, n])
n =0
elif len(a) == i:
li.append([i, k])
print(li)
一個球從100米高度自由落下,每次落地後反跳回原高度的一半;再落下,求它在第10次落地時,共經過多少米?第10次反彈多高?
def fun(n):
if n ==1:
return 100 /2
else:
res = fun(n -1) /2
return res
print(fun(10))
def func(n):
if n ==1:
return 100
else:
return (fun(n -1) *2) + func(n -1)
print(func(10))
# for 循環實現
def height_100():
# 定義S用來計算總距離
s =0
h =100
for iin range(10):
# 加上本次落地的距離
s += h
h = h /2
# 加上反彈的距離
s += h
print(f'第10次落地的總距離為:{s-h}')
print(f'第10次反彈的高度:{h}')
height_100()
斐波拉契數列
[1,1,2,3,5,8,13,21,34,55]
分析:
月份 數量
1 2隻
2 2隻
3 4隻
4 6隻
5 10隻
6 16隻
def tu_func(n):
if n ==1 or n ==2:
return 2
else:
return tu_func(n -1) + tu_func(n -2)
print(tu_func(10))
# for 循環實現
def tu_func1(n):
s = []
for iin range(1, n +1):
if i ==1 or i ==2:
s.append(2)
else:
s.append(s[i -2] + s[i -3])
return s
print(tu_func1(10))
小明有100元錢 打算買100本書,A類書籍5元一本,B類書籍3元一本,C類書籍1元兩本,
請用程序算出小明一共有多少種買法?
def func3():
count =0
for ain range(21):
for bin range(34):
c =100 - a - b
if a *5 + b *3 + c *0.5 ==100:
count +=1
print(a, b, c)
print(F'一共有{count}種買法')
func3()
C. 演算法面試通關40講 覃超 Leetcode 題目總結(未完待續)
主要是自己收集的題目,正在學習王爭老師的數據與演算法結構之美和覃超老師的演算法面試通關四十講,兩位老師推薦很經典的面試題。所以為了方便自己,在這里做一個匯總。如果對你有幫助那當然好,或者也可以看參考資料,裡面有很多優秀的Github的資源。
參考資料
演算法復雜度查看: https://www.bigocheatsheet.com/
C語言解法推薦: https://github.com/begeekmyfriend/leetcode
java解法推薦: https://github.com/azl397985856/leetcode
數據結構與演算法之美(王爭)(有各種語言的版本): https://github.com/wangzheng0822/algo
Github 40K star leetcode: https://github.com/azl397985856/leetcode
Github 13K star Leetcode: https://github.com/haoel/leetcode
Github 63K star 用動畫的形式呈現解LeetCode題目的思路: https://github.com/MisterBooo/LeetCodeAnimation
python 解法: https://github.com/qiyuangong/leetcode
其他解法: https://github.com/qiyuangong/leetcode
06|面試題:反轉一個單鏈表&判斷鏈表是否有環
數據與演算法結構之美:
21 Merge Two Sorted Lists 【 C 】【 python 】
刪除鏈表倒數第 n 個結點 【 Leetcode 的解題 】
求鏈表的中間結點 Middle of the Linked List
20 Valid Parentheses
232 Implement Queue using Stacks 【 C 】【 My C solution 】
225 Implement Stack using Queues 【 C 】
703 Kth Largest Element in a Stream
239 Sliding Window Maximum
242 Valid Anagram
1 Two Sum 【 C 】
15 3Sum
18 4Sum
98 Validate Binary Search Tree
235 Lowest Common Ancestor of a Binary Search Tree
236 Lowest Common Ancestor of a Binary Tree
50 Pow(x, n)
169 Majority Element
122 Best Time to Buy and Sell Stock II
冒泡排序,選擇排序,插入排序,供參考:【 C 】
(未完待續,大概等我做完上面這些就可以繼續補充剩下的了吧)
D. 如何回答面試演算法問題
給定一個有序數組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級別的數據
E. 演算法-面試題系列 - 求數組左部分最大值減去右部分最大值的絕對值
給定一個數組arr長度為N,你可以把任意長度大於0且小於N的前綴作為左部分,剩下的作為右部分。
但是每種劃分下都有左部分的最大值和右部分的最大值
請返回最大的, 左部分最大值減去右部分最大值的絕對值 。
演算法流程
我們要求左邊最大減去右邊最大,max肯定是在左邊數組和右邊數組中的最後參與決策的最大數。
假設12在左邊數組中,右邊數組剩下[5,6,7]
因為把max放入了左邊的數組,所以, 我們需要右邊數組的最大值盡可能的小 ,數組個數越少,他的最大值就是盡可能的小,比如剩下[5,6,7]的情況,我們可以看到我們區arr[N-1]這個數作為右側數組,是最滿足 左部分最大值減去右部分最大值的絕對值 條件的。
同理 把max劃分到右側數組,左側數組a[0]劃分是最符合條件的。
F. java演算法面試題
三個for循環,第一個和第二個有啥區別?去掉一個吧
可以用迭代器remove方法,在移除的同時添加。
不知道是你記錯了還是題本身就這樣,我只想說:
寫這代碼的是二貨么?
1、每個循環的索引都是從0開始,這是什麼遍歷方式?
2、看這題的目的是想把用戶添加到相應的組里,這我就不明白了,新建一個用戶的時候就沒分配組么?那用戶的GroupId哪來的?
3、這是一個操作,難道就不會根據GroupId直接查出用戶或者組么?
這哪是優化代碼?分明是挖坑。
G. 常見面試演算法題2:二叉樹的最近公共父親節點
程序員面試中對數據結構的考察,除了單鏈表,考察最為頻繁的就是二叉樹了,而二叉樹的最近公共父節點又是較為常見的一道演算法題,博主年前面試vivo互聯網部門的時候就被考察過,下邊介紹下這道演算法題的思路和源碼。
兩個節點Node1和Node2的最近父節點可以用下邊的思路得到:
首先,當Node1位於Node2的左子樹或者右子樹時,則Node1和Node2的最近父節點為Node2;
否則,反之當Node2位於Node1的左子樹或者右子樹時,則Node1和Node2的最近父節點為Node1;
再否則,Node1和Node2的最近父節點為以包含Node1和Node2l兩個節點的最小子樹的根節點。
經過上邊的分析可以用遞歸的方法來解這道題,
H. 面試經典數據結構和演算法匯總
如果說數據結構是骨架,那麼演算法就是靈魂。沒了骨架,靈魂沒有實體寄託;沒了靈魂,骨架也是個空殼。兩者相輔相成,缺一不可,在開發中起到了砥柱中流的作用。
現在我對各種數據結構和演算法做一總結,對比一下它們的效率
1.數據結構篇
1. 如果讓你手寫個棧和隊列,你還會寫嗎?
2. 開發了那麼多項目,你能自己手寫個健壯的鏈表出來嗎?
3. 下次面試若再被問到二叉樹,希望你能對答如流!
4. 面試還在被紅-黑樹虐?看完這篇輕松搞定面試官 !
2.排序演算法篇
1. 幾個經典的基礎排序演算法,你還記得嗎?
2. 手把手教你學會希爾排序,很簡單!
3. 快速排序演算法到底有多快?
4. 五分鍾教你學會歸並排序
5. 簡單說下二叉樹排序
6. 學會堆排序只需要幾分鍾
7. 圖,這個玩意兒竟然還可以用來排序!
掌握了這些經典的數據結構和演算法,面試啥的基本上沒什麼問題了,特別是對於那些應屆生來說。接下來再總結一下不同數據結構和演算法的效率問題,做一下對比,這也是面試官經常問的問題。
數據結構常用操作效率對比:
常用排序演算法效率的對比:
關於經典的數據結構和演算法,就總結到這,本文建議收藏,利用等公交、各種排隊之時提升自己。這世上天才很少,懶蛋卻很多,你若對得起時間,時間便對得起你。
I. 面試官常問十大經典演算法排序(用Python實現)
演算法是一種與語言無關的東西,更確切地說就算解決問題的思路,就是一個通用的思想的問題。代碼本身不重要,演算法思想才是重中之重
我們在面試的時候總會被問到一下演算法,雖然演算法是一些基礎知識,但是難起來也會讓人非常頭疼。
排序演算法應該算是一些簡單且基礎的演算法,但是我們可以從簡單的演算法排序鍛煉我們的演算法思維。這里我就介紹經典十大演算法用python是怎麼實現的。
十大經典演算法可以分為兩大類:
比較排序: 通過對數組中的元素進行比較來實現排序。
非比較排序: 不通過比較來決定元素間的相對次序。
演算法復雜度
冒泡排序比較簡單,幾乎所有語言演算法都會涉及的冒泡演算法。
基本原理是兩兩比較待排序數據的大小 ,當兩個數據的次序不滿足順序條件時即進行交換,反之,則保持不變。
每次選擇一個最小(大)的,直到所有元素都被輸出。
將第一個元素逐個插入到前面的有序數中,直到插完所有元素為止。
從大范圍到小范圍進行比較-交換,是插入排序的一種,它是針對直接插入排序演算法的改進。先對數據進行預處理,使其基本有序,然後再用直接插入的排序演算法排序。
該演算法是採用 分治法 對集合進行排序。
把長度為n的輸入序列分成兩個長度為n/2的子序列,對這兩個子序列分別採用歸並排序,最終合並成序列。
選取一個基準值,小數在左大數在在右。
利用堆這種數據結構所設計的一種排序演算法。
堆是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。利用最大堆和最小堆的特性。
採用字典計數-還原的方法,找出待排序的數組中最大和最小的元素,統計數組中每個值為i的元素出現的次數,對所有的計數累加,將每個元素放在新數組依次排序。
設置一個定量的數組當作空桶;遍歷輸入數據,並且把數據一個一個放到對應的桶里去;對每個不是空的桶進行排序;從不是空的桶里把排好序的數據拼接起來。
元素分布在桶中:
然後,元素在每個桶中排序:
取得數組中的最大數,並取得位數;從最低位開始取每個位組成新的數組;然後進行計數排序。
上面就是我整理的十大排序演算法,希望能幫助大家在演算法方面知識的提升。看懂之後可以去試著自己到電腦上運行一遍。最後說一下每個排序是沒有調用數據的,大家記得實操的時候要調用。
參考地址:https://www.runoob.com/w3cnote/ten-sorting-algorithm.html
J. 經典C語言面試演算法題
1.寫一個函數,它的原形是int continumax(char *outputstr,char *intputstr)
功能:
在字元串中找出連續最長的數字串,並把這個串的長度返回,並把這個最長數字串付給其中一個函數參數outputstr所指內存。例如:"abcd12345ed125ss123456789"的首地址傳給intputstr後,函數將返回
9,outputstr所指的值為123456789。
#include
#include
#include
int FindMax_NumStr(char *outputstr,char *inputstr)
{
char *in = inputstr,*out = outputstr,*temp;
char *final;
int count = 0;
int maxlen = 0;
int i;
while(*in!='