2019年某公司一道笔试题如图:
现在需要注意的问题:
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 : list1.append(int(list2.pop())) 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=" ")