zoukankan      html  css  js  c++  java
  • 双指针查找数组的连续规律子数组问题

    1. 查找连续重复的子数组

    var arr = [1,2,3,9,9,9,9,6,7,9,9,9,8,10,10,10,15,10,10];
    var fContinue1 = function(arr,start,end){
        return arr[end+1] - arr[end] != 0 && end - start > 0;
    },
    fForward1 = function(arr,start,end){
        return arr[end+1] - arr[end] == 0;
    };
    console.log(getResultCommon(arr,fContinue1,fForward1));

    2. 查找连续等差的子数组

    var arr = [1,2,3,9,10,11,12,6,7,9,9,9,8,10,11,12,15,19,20];
    var fContinue2 = function(arr,start,end){
        return arr[end+1] - arr[end] != 1 && end - start > 0
    },
    fForward2 = function(arr,start,end){
        return arr[end+1] - arr[end] == 1
    };
    console.log(getResultCommon(arr,fContinue2,fForward2));

    3. 查找连续等比子数组

    var arr = [1,2,3,9,18,36,12,6,7,9,9,9,8,16,32,12,15,30,60];
    var fContinue3 = function(arr,start,end){
        return arr[end+1] / arr[end] != 2 && end - start > 0
    },
    fForward3 = function(arr,start,end){
        return arr[end+1] / arr[end] == 2
    };
    console.log(getResultCommon(arr,fContinue3,fForward3));

    4. 查找连续平方子数组

    var arr = [1,2,3,9,81,11,12,6,2,4,8,64,8,10,11,4,16,256,10];
    var fContinue4 = function(arr,start,end){
        return arr[end+1] / arr[end] != arr[end] && end - start > 0
    },
    fForward4 = function(arr,start,end){
        return arr[end+1] / arr[end] == arr[end];
    };
    console.log(getResultCommon(arr,fContinue4,fForward4));

    通用的方法

    /**
     *
     * @param arr 目标数组
     * @param fContinue 检测双指针的位置是否符合条件,返回布尔值
     * @param fForward  检测相邻值是否符合条件,快指针是否继续移动,返回布尔值
     */
    function getResultCommon(arr,fContinue,fForward){
        var start = end = 0;
        var len = arr.length;
        var res = [];
        while(end < len + 1){
            if(fContinue(arr,start,end)){
                res.push([start,end]);
                end++;
                start = end;
                continue;
            }
            if(fForward(arr,start,end)){
                end++;
            }
            else{
                end++;
                start = end;
            }
        }
        return res;
    }
  • 相关阅读:
    配置Gitlab pages和Gitlab CI
    程序员不应该错过的 6大导航
    Ice简介+Qt代码示例
    Android开发者的Anko使用指南(四)之Layouts
    三种方式绘制图片
    产品-(前后端)开发-测试的见解
    01_Docker概念简介、组件介绍、使用场景和命名空间
    Docker 创建 Confluence6.12.2 中文版
    读再多懂再多的鸡汤,不如每天敲码思考总结
    Postman Mock Server
  • 原文地址:https://www.cnblogs.com/mengff/p/9337757.html
Copyright © 2011-2022 走看看