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