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

为何我对这道Codewars编程题的逻辑理解有误?

问题分析与解决

题目明确要求

编写函数largest_difference,接收数字数组data,返回满足data[i] <= data[j] 且 i < j的最大索引差j - i。注意:不得对数组排序、修改元素顺序或值。

示例:输入[1,2,3]返回2,对应i=0、j=2,2-0=2。

测试用例误解说明

测试用例[9,4,1,2,3,0,-1,-2]的预期答案是2,原因如下:
题目要求的是i在j前面(i < j)且data[i] <= data[j],你想的9(i=0)和-2(j=7)中,data[i]=9 > data[j]=-2,不符合data[i] <= data[j]的条件,所以这对不算。
符合条件的最远索引差是2:比如i=2(data[i]=1)、j=4(data[j]=3),4-2=2,这是满足条件的最大差值。

你的错误代码

def largest_difference(data: list[int]):
    differences_list: list[int] = []

    left_index: int = 0
    right_index: int = 0
    pointer_index: int = len(data) - 1

    def move_index_left(data: list[int], pointer_index: int, left_index: int, differences_list: list[int]):
        left_index = pointer_index - 1

        while(True):
            if left_index == -1:
                break

            if data[left_index] < data[pointer_index]:
                differences_list.append(abs(pointer_index - left_index))

            left_index -= 1

        return differences_list


    def move_index_right(data: list[int], pointer_index: int, right_index: int, differences_list: list[int]):
        right_index = pointer_index + 1

        while(True):
            if right_index == len(data):
                break

            if data[right_index] < data[pointer_index]:
                differences_list.append(abs(pointer_index - right_index))

            right_index += 1

        return differences_list
        
    while(True):
        if pointer_index == -1:
            break

        if pointer_index == len(data) - 1:
            differences_list = move_index_left(data, pointer_index, left_index, differences_list)
            pointer_index -= 1

        elif pointer_index == 0:
            differences_list = move_index_right(data, pointer_index, right_index, differences_list)
            pointer_index -= 1

        else:
            differences_list = move_index_left(data, pointer_index, left_index, differences_list)
            differences_list = move_index_right(data, pointer_index, right_index, differences_list)
            pointer_index -= 1


    return max(differences_list)

代码问题点

  1. 逻辑错误:move_index_right中加入了data[right_index] < data[pointer_index]的差值,这对应的是data[i] > data[j](i是pointer,j是right_index),完全不符合题目要求的data[i] <= data[j]条件,这部分差值不该被统计。
  2. 漏判场景:题目要求判断data[i] <= data[j],但代码只处理了data[i] < data[j]的情况,忽略了相等的场景。

正确解法

直观解法(O(n²)时间,适合小规模数组)

遍历所有i<j的组合,统计满足data[i] <= data[j]的最大索引差:

def largest_difference(data: list[int]) -> int:
    max_diff = 0
    n = len(data)
    for i in range(n):
        for j in range(i, n):
            if data[i] <= data[j]:
                current_diff = j - i
                if current_diff > max_diff:
                    max_diff = current_diff
    return max_diff

优化解法(O(n)时间,O(n)空间)

通过预处理前缀最小值数组,减少重复比较,提升效率:

def largest_difference(data: list[int]) -> int:
    n = len(data)
    if n <= 1:
        return 0
    
    # 前缀最小值数组:min_left[i]表示data[0..i]中的最小值
    min_left = [0] * n
    min_left[0] = data[0]
    for i in range(1, n):
        min_left[i] = min(min_left[i-1], data[i])
    
    max_diff = 0
    # 从后往前遍历每个j,找最左边的i使得min_left[i] <= data[j]
    for j in range(n-1, -1, -1):
        i = 0
        while i <= j:
            if min_left[i] <= data[j]:
                max_diff = max(max_diff, j - i)
                break  # 找到最左i就停止,保证j-i最大
            i += 1
    return max_diff

内容的提问来源于stack exchange,提问作者Avery

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:43:17