当前位置: 面试刷题>> 等差切片 (经典算法题500道)


完整题目描述

等差切片

给定一个整数数组 arr 和一个整数 k,你需要找到所有在数组中长度至少为 k 的子数组(切片),这些子数组满足任意两个相邻元素之间的差等于给定的整数 d

要求:

  1. 返回所有满足条件的子数组(切片)的起始索引和结束索引(包含两端)。
  2. 如果有多个这样的子数组,则按照它们在原数组中出现的顺序返回。
  3. 如果没有找到任何满足条件的子数组,则返回一个空数组。

示例

输入:

  • arr = [1, 2, 3, 4, 5, 6]
  • k = 3
  • d = 1

输出:

  • [[0, 2], [1, 3], [2, 4], [3, 5]]

解释:

  • [1, 2, 3] 是一个满足条件的子数组,起始索引为 0,结束索引为 2。
  • [2, 3, 4] 也是一个满足条件的子数组,起始索引为 1,结束索引为 3。
  • 以此类推,[3, 4, 5][4, 5, 6] 同样满足条件。

PHP 示例代码

function findArithmeticSlices($arr, $k, $d) {
    $n = count($arr);
    $result = [];
    
    for ($i = 0; $i <= $n - $k; $i++) {
        $isValid = true;
        for ($j = 1; $j < $k; $j++) {
            if ($arr[$i + $j] - $arr[$i + $j - 1] != $d) {
                $isValid = false;
                break;
            }
        }
        if ($isValid) {
            $result[] = [$i, $i + $k - 1];
        }
    }
    
    return $result;
}

// 示例用法
$arr = [1, 2, 3, 4, 5, 6];
$k = 3;
$d = 1;
print_r(findArithmeticSlices($arr, $k, $d));

Python 示例代码

def findArithmeticSlices(arr, k, d):
    result = []
    n = len(arr)
    
    for i in range(n - k + 1):
        if all(arr[i + j] - arr[i + j - 1] == d for j in range(1, k)):
            result.append([i, i + k - 1])
            
    return result

# 示例用法
arr = [1, 2, 3, 4, 5, 6]
k = 3
d = 1
print(findArithmeticSlices(arr, k, d))

JavaScript 示例代码

function findArithmeticSlices(arr, k, d) {
    const result = [];
    const n = arr.length;
    
    for (let i = 0; i <= n - k; i++) {
        let isValid = true;
        for (let j = 1; j < k; j++) {
            if (arr[i + j] - arr[i + j - 1] !== d) {
                isValid = false;
                break;
            }
        }
        if (isValid) {
            result.push([i, i + k - 1]);
        }
    }
    
    return result;
}

// 示例用法
const arr = [1, 2, 3, 4, 5, 6];
const k = 3;
const d = 1;
console.log(findArithmeticSlices(arr, k, d));

码小课网站中有更多相关内容分享给大家学习,包括但不限于算法、数据结构、编程技巧等,帮助大家提升编程能力。

推荐面试题