当前位置: 首页 > 知识库问答 >
问题:

如何解决CountDistinctSlices编码问题

韩烈
2023-03-14

我正在尝试“CountDiinctSlices”代码性问题。我尽力了,得分30%,所以试图查找这样做的人以获得洞察力。基本上,我在答案中没有得到的是初始化的看到的数组(和M)的使用以及它是如何被使用的,得到它的人可以友好地引导我完成这段代码。

这是我没有解释就找到的答案

function solution(M, A) {
    // write your code in JavaScript (Node.js 8.9.4)
    let sum = 0;
    let front = 0;
    let back = 0;
    const seen = new Array(M+1).fill(false);
    while (front < A.length && back < A.length){
        while (front < A.length && seen[A[front]] !== true){
            sum += (front-back+1);
            seen[A[front]] = true;
            front += 1;
        }
        while (A[back] !== A[front]){
            seen[A[back]] = false;
            back += 1;
        }
        seen[A[back]] = false;
        back += 1;
    }           
    return Math.min(sum, 1000000000);
}

这是全部问题

给出了一个整数M和一个由N个非负整数组成的非空数组a。数组A中的所有整数都小于或等于M。

一对整数(P,Q),使得0≤ P≤ Q

例如,考虑整数M=6和数组A,使得:A[0]=3 A[1]=4 A[2]=5 A[3]=5 A[4]=2

正好有九个不同的切片:(0,0),(0,1),(0,2),(1,1),(1,2),(2,2),(3,3),(3,4)和(4,4)。

目标是计算不同切片的数量。

编写函数:

function solution(M, A);

如果给定一个整数M和一个由N个整数组成的非空数组a,则返回不同的片数。

如果不同切片的数量大于1000000000,则函数应返回1000000000。

例如,给定整数M=6和数组A,以便:

A[0] = 3

A[1] = 4

A[2] = 5

A[3] = 5

A[4] = 2

如上所述,函数应返回9。

为以下假设编写一个有效的算法:

    N is an integer within the range [1..100,000];
    M is an integer within the range [0..100,000];
    each element of array A is an integer within the range [0..M].

共有1个答案

堵恺
2023-03-14

我们先来看看算法:

>

  • 首先从起点开始遍历,直到找到重复项。现在您有了一个范围=[后-前]

    代码将此范围称为[back, Front],其中“back”是开始,“Front”是您的移动指针。这个范围内有多少不同的切片?有大小为1、2、......的切片。前-后1,所以它是sum=1 2 3...[前-后1]

    现在您遇到重复的应该怎么做?为了理解,让我们以问题中的示例为例:[3,4,5,5,2]。现在到达5。现在我们应该将back指针带到5,但同时也要从集合中删除元素3,4,5,因为这些元素可能存在于当前前端之后。因此back来到5,当前由指向。

    让我们再举一个例子,因为这是找到的第一个重复项,所以前面的部分将到达索引处的1。现在应该回到哪里?它应该达到2,因为当您在向后移动指针的同时删除集合中的元素时,集合将不会有任何重复的位置。

    执行此操作,直到前部到达阵列的末端。

    关于您的问题,请参见:

    如何在数组中找到重复项?可以使用集合,也可以使用布尔数组。我认为在这个问题中,M的唯一目的是指定数组中元素可以具有的最大值。因此,代码使用了一个大小为M的布尔数组。

    如果使用布尔数组,一旦找到一个值元素,比如说v,就可以说v=true,这意味着它被“看到”。

    或者,您可以使用一个集合并在需要时创建一个新的集合,而无需在每次发现重复的布尔数组时清除整个布尔数组,方法是让JavaScript处理垃圾收集,如下所示(未完全测试):

    function solution(M, A) {
        let sum = 0;
        let front = 0;
        let back = 0;
        let set = new Set();
        while (front < A.length) {
            while (front < A.length && !set.has(A[front])){
                sum += (front-back+1);
                set.add(A[front]);
                front += 1;
            }
            while (A[back] != A[front]) {
                set.delete(A[back]);
                back += 1;
            }
            set.delete(A[back]);
            back += 1;
        }           
        return Math.min(sum, 1000000000);
    }
    

  •  类似资料:
    • 我发现了一个问题,即数据在控制器中正确编码并编译,但在alert语句中(或页面上)没有正确显示。请看下面的配置。 Tomcat服务器属性 null null null null null null null server.xml配置 我在这里缺少了什么样的简单配置?

    • 问题内容: 如何解决? 在其他基于python的静态博客应用中,中文帖子可以成功发布。像这个程序:http : //github.com/vrypan/bucket3。在我的网站http://bc3.brite.biz/中,中文帖子可以成功发布。 问题答案: tl;dr / quick fix 不要对Willy Nilly进行解码/编码 不要以为你的字符串是UTF-8编码的 尝试在代码中尽快将字符

    • 问题内容: 下面的程序引发NullPointerException。在Log cat中,它显示: 单击该按钮时,它不会进入Mousefragment类。我试图解决它,但是我不能-如何解决这个问题? 编辑 单击该按钮多少次,该异常随同invalid_ip Toast消息一起显示 问题答案: 如前所述,您的问题询问如何解决此问题。 您需要弄清楚在哪里抛出。为此,请查看堆栈跟踪以查看引起问题的行。然后,

    • 问题内容: 我在做一个 用。我有我的输出。有人可以帮我吗?谢谢。 sendMailServlet代码: 在GlassFish 2.1上的输出: 问题答案: 您需要实施一个自定义 现在在 另请查看JavaMail常见问题解答

    • 本文向大家介绍解决Android 源码编译错误的问题,包括了解决Android 源码编译错误的问题的使用技巧和注意事项,需要的朋友参考一下 如下所示: Building with Jack: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex FAILED: /bin/bash ou

    • 任何人都可以帮助我解决这个问题AndroidManifest.xml mainactivity.kt