Python实现小明种苹果算法:环形列表处理的简洁方案

方予
方予
发布时间:2026-10-14 | 2人浏览过
原创

本文深入解析Python解决“小明种苹果”问题的多种实现方式,重点探讨环形数组中连续三棵树掉落情况的统计方法。通过对比索引取余、列表拼接及直接遍历等策略,提供一种从列表尾部开始读取的简洁代码方案,并附带其他常见解法供参考,旨在帮助开发者更高效地处理此类边界条件复杂的算法题。

问题背景与核心任务

本题主要涉及三个核心计算任务:

  1. 计算所有操作执行完毕后,各苹果树上剩余苹果的总数;
  2. 统计发生苹果掉落现象的苹果树数量;
  3. 计算相邻三棵苹果树同时发生掉落情况的组合数量。

环形列表处理的三种常见思路

其中最具挑战性的是第三问。直观理解下,若苹果树呈线性排列,只需将每棵树是否掉落的状态记录在列表中,统计连续出现三个1的次数即可。然而,题目设定N棵树围成一个圆环,这意味着“相邻”关系需要特殊处理列表的首尾衔接问题。 纵观常见解法,主要存在三种处理思路:

  1. 当树木数量超过三棵时,利用列表索引对长度求余的方式来处理边界;
  2. 另一种方法是将列表的前两个元素追加到列表末尾,从而模拟环形结构;
  3. 第三种方法相对繁琐,每次遍历时需手动判断并更新索引以处理首尾情况。

简洁代码实现方案

鉴于上述方法略显复杂,此处提供一种更为简洁的代码实现:


for i in range(len(l)):
 if l[i-2] and l[i-1] and l[i]:
 e += 1

通过调整读取起始位置,直接从列表的最后两个元素开始遍历,若连续三个状态均为1,则计数器e自增。该方法在逻辑上更为直观简便。

同时附上上述三种思路的具体代码实现,供读者根据实际需求选用:

①


if N >= 3: # 苹果树少于三棵时 直接为0
 for y in range(len(is_fall)):
 if is_fall[y%len(is_fall)] == is_fall[(y+1)%len(is_fall)] == is_fall[(y+2)%len(is_fall)] == 1:
  E += 1
else:
 E = 0

②


res_drop.append(res_drop[0])
res_drop.append(res_drop[1])
for i in range(N):
 if res_drop[i] == 1 and res_drop[i+1] == 1 and res_drop[i+2] == 1:
 num += 1
print(' '.join([str(res),str(count_drop),str(num)]))

③


for i in range(len(is_fall)):
 pre=i-1
 if pre<0:
 pre+=len(is_fall)
 next=i+1
 if next > len(is_fall)-1:
 next-=len(is_fall)
 if is_fall[pre]==is_fall[i]==is_fall[next]==1:
 E+=1

完整解题逻辑与代码解析

以下是我对该题目的完整解法实现:


n = int(input())
result = 0 # 总共剩余的苹果
count = 0
e = 0 # 连续三颗树的掉落情况
dl = 0 # 掉落的苹果棵树
l = [0] * n # n颗苹果树是否有苹果掉落的情况
for i in range(n):
 fs = []
 zs = []
 s = total = 0
 x = list(map(int,input().split()))
 x = x[::-1]
 caozuo = x.pop()
 #判断剩余的苹果个数
 for j in range(caozuo):
 s = x[j]
 if s <= 0:
  fs.append(s)
  #print(fs)
 else:
  zs.append(s)
  break

 result += sum(fs) + zs[0]

 total = x.pop()
 ss = 0
 for j in range(len(x)):
 flag = z = 0
 s = x.pop()
 if s < 0:
  ss = ss + s
 elif s == 0:
  continue
 else:
  z = s
  total = total + ss
  if total > z:
  flag = 1
  else:
  flag = 0
 l[i] = flag
 if flag == 1:
  dl += 1
  break
 else:
  continue
  
for i in range(len(l)):
 if l[i-2] and l[i-1] and l[i]:
 e += 1
print(result,dl,e)

第一问的解题思路是对操作列表进行反转,随后遍历列表。当遇到负数时将其累加,遇到正数时停止累加,并将该正数与之前的负数累加和相加,循环执行以计算所有树上的剩余苹果总数。 第二问的思路是利用栈结构,对弹出列表中的元素进行求和。当遇到正数时停止比较,通过判断总和与正数的大小关系来确定是否发生苹果掉落。

以上即为Python解决小明种苹果问题的详细解析,更多关于Python算法技巧的资料请关注本站其他相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表