You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python判断列表元素先非递减后非递增?

解决数字先非递减后非递增的判断问题

嘿,我来帮你搞定这个需求!你已经有了判断全递增/递减的基础,现在只需要扩展一个核心函数,专门检查「先非递减、后非递增」的模式就行。咱们一步步来:

核心思路

要判断数字的各位是否符合先非递减后非递增,关键是找到峰值点:

  1. 从左到右遍历,找到第一个位置,使得当前数字大于下一个数字(这就是递增阶段的结束,递减阶段的开始)
  2. 如果遍历完整个数组都没找到这样的位置,说明整个数组是非递减的,符合要求
  3. 从峰值点开始,检查剩下的部分是否保持非递增(包括相等的情况)
  4. 还要注意:全递减的情况也属于符合条件(相当于峰值点在第一个位置)

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:36:59