面試筆試演算法題練習一(列表逆數)

2021-09-26 06:47:28 字數 2052 閱讀 3396

2023年某公司一道筆試題如圖: 

現在需要注意的問題:

1.若人在樓棟中間,最少可以看見3棟樓(兩旁的樓+自身所在樓),若樓層無遮蓋,則可以看見更多。

2.若人在兩邊界,則最少可以看見2棟樓(一旁的樓+自身所在樓),若樓層 無遮蓋,則可以看見更多。

自己的錯誤思路1:

簡單的計算逆數,只算有無遮蓋,忽略了若建築物最高,則視線後面的全部看不見的道理。

自己的錯誤思路2:

要比較最高樓棟,所以採用兩個指標(flag),乙個指向頭,乙個指向尾,向中間靠攏,相等時結束計數。這種方法搞錯了人的視線,人在中間,應該是兩個指標先相等,然後按照視線的方向相向移動,當乙個指標指向頭,結束該指標,另乙個指標指向尾,同樣結束該指標,計數完畢。

自己正確思路:

1.獲取n

2.獲取輸入的列表list1

3.遍歷該列表:

3.1 初始化計數器,count = 3

3.2 定義兩個移動指標,這樣就是k = i-1  ;i  ; j = i + 1

3.3 討論邊界,若是邊界,count -= 1 ,且只討論一邊的情況

3.4 判斷當前值是否為序列最大值(該序列分為兩個,對應兩個邊),若是最大值,則停止計數

**如下

n = input("樓棟數:")

list1 =

str1 = input ("輸入每棟樓樓層,以空格隔開:")

list2 = str1.split(" ")

list2_length = len(list2)

i = 0;

while i <= list2_length-1 :

i += 1

list1.reverse()

for i in range(list2_length) :

count = 3 # 初始化計數器

k = i-1

j = i+1

# k為前指標 j為後指標

beflist = list1[0:i]

aftlist = list1[i:list2_length]

#討論邊界

if i-1 < 0 :

count -= 1

while j < list2_length-1 :

if list1[j] == max(aftlist):

break #當遇到最高建築物,停止計數

if list1[j+1] > list1 [j]:

count += 1 #視線後面建築物比前面高,計數器加1

j += 1

elif i >= list2_length-1 :

count -= 1

while k > 0 :

if list1[k] == max(beflist) :

break

if list1[k-1] > list1 [k] :

count += 1

k -= 1

else:

while k > 0:

if list1[k] == max(beflist):

break

if list1[k - 1] > list1[k]:

count += 1

k -= 1

while j < list2_length-1 :

if list1[j] == max(aftlist):

break #當遇到最高建築物,停止計數

if list1[j+1] > list1 [j]:

count += 1 #視線後面建築物比前面高,計數器加1

j += 1

print(count, end=" ")

面試筆試演算法目錄

尋找缺失的數字 二進位制中1的個數 位運算 檢測乙個數能否被3整除 位運算 判斷兩個數是否符號相反 位運算 數字轉字母的編碼方式的個數 dp 直方圖最大面積 dp 求最長上公升 下降子串行 o nlgn 尋找下乙個較大元素 利用棧 包含min函式的棧 利用棧 中綴表示式轉為字尾表示式 棧 tromi...

面試筆試演算法 euler

todo 大整數減法 除法 int a 1,b 1,c 2 斐波那契遞推 while int func int x return t raw long long ans,zero cnt,now 1 if num i 0 else if num i 13 0 else if zero cnt 0 a...

面試筆試演算法 廣搜

用於計算地圖中起點到終點最短步長問題。廣蒐時,偶爾會有疑惑,為什麼可以在標記地圖上直接標上步數?會不會有別的點廣蒐時步數更小的情況?答案當然是不會的,在初始情況時,一定要把所有初始點塞進佇列中,才能開始廣搜,這樣保證每一輪都穩定地往起始點外擴乙個步長,並且先標記到的格仔中記錄的一定是最短步長。難得的...