如何用Python判断列表元素先非递减后非递增?
解决数字先非递减后非递增的判断问题
嘿,我来帮你搞定这个需求!你已经有了判断全递增/递减的基础,现在只需要扩展一个核心函数,专门检查「先非递减、后非递增」的模式就行。咱们一步步来:
核心思路
要判断数字的各位是否符合先非递减后非递增,关键是找到峰值点:
- 从左到右遍历,找到第一个位置,使得当前数字大于下一个数字(这就是递增阶段的结束,递减阶段的开始)
- 如果遍历完整个数组都没找到这样的位置,说明整个数组是非递减的,符合要求
- 从峰值点开始,检查剩下的部分是否保持非递增(包括相等的情况)
- 还要注意:全递减的情况也属于符合条件(相当于峰值点在第一个位置)
修改后的完整代码
x = int(input("Please enter a number: ")) y = [int(d) for d in str(x)] def is_non_increasing(y): # 原isDecreasing函数其实是判断非递增(允许相等),这里重命名更准确 for i in range(len(y) - 1): if y[i] < y[i + 1]: return False return True def is_non_decreasing(y): # 补充判断非递减的函数(和非递增逻辑相反) for i in range(len(y) - 1): if y[i] > y[i + 1]: return False return True def is_valley_pattern(y): # 处理特殊情况:单个数字直接符合 if len(y) <= 1: return True # 找到递增阶段的结束位置(峰值点) peak_index = 0 while peak_index < len(y) - 1 and y[peak_index] <= y[peak_index + 1]: peak_index += 1 # 如果峰值在最后,说明整个数组是非递减的,符合条件 if peak_index == len(y) - 1: return True # 从峰值点开始检查是否非递增 return is_non_increasing(y[peak_index:]) # 最终判断:符合全递增、全递减,或者先非递减后非递增的模式 if is_non_decreasing(y) or is_non_increasing(y) or is_valley_pattern(y): print(f"The number {x} follows the non-decreasing then non-increasing pattern!") else: print(f"The number {x} does NOT follow the pattern.")
代码说明
- 我把原
isDecreasing重命名为is_non_increasing,这样命名更准确(它允许相邻数字相等,比如5543会返回True) - 补充了
is_non_decreasing函数,用来判断全非递减的情况 - 核心函数
is_valley_pattern负责检查先升后降的逻辑:- 先找到峰值点,确认前面的部分都是非递减的
- 再检查峰值点之后的部分是否都是非递增的
- 最终判断整合了三种符合条件的情况:全非递减、全非递增、先非递减后非递增
测试案例
- 输入
123431→ 返回符合 - 输入
4577852→ 返回符合 - 输入
12233221→ 返回符合 - 输入
12345→ 返回符合(全非递减) - 输入
54321→ 返回符合(全非递增) - 输入
1212→ 返回不符合(先升后降又升了)
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

