Javascript 黑客等级年表

Javascript 黑客等级年表,javascript,Javascript,我正在尝试用JavaScript解决这里描述的问题 我必须输出需要从两个字符串中删除的字母数,以便只有匹配的字母(比较两个字符串中的匹配字母,并合计不匹配的字母) 例如 字符串a=cbe 字符串b=abc 两个字符串之间唯一匹配的字母是两个c,因此我将删除4个字母(beab) 我的代码工作正常,但似乎一直超时。如果我下载单个测试用例实例,当变量a和b设置为大字符串时,我似乎失败了。如果我单独测试这些,我似乎得到了正确的输出,但我仍然得到消息“由于超时而终止” 我想可能有人会很清楚为什么我的代码

我正在尝试用JavaScript解决这里描述的问题

我必须输出需要从两个字符串中删除的字母数,以便只有匹配的字母(比较两个字符串中的匹配字母,并合计不匹配的字母)

例如

字符串a=cbe 字符串b=abc

两个字符串之间唯一匹配的字母是两个c,因此我将删除4个字母(beab)

我的代码工作正常,但似乎一直超时。如果我下载单个测试用例实例,当变量a和b设置为大字符串时,我似乎失败了。如果我单独测试这些,我似乎得到了正确的输出,但我仍然得到消息“由于超时而终止”

我想可能有人会很清楚为什么我的代码超时了。我不确定这是解决问题最优雅的方式,但我很想让它发挥作用。任何帮助都将不胜感激

function main() {
    var a = readLine();
    var b = readLine();

    var arraya = a.split('');
    var arrayb = b.split('');

    var arraylengths = arraya.length + arrayb.length;

    //console.log(arraylengths); 

    if (arraya.length <= arrayb.length) {
        var shortestarray = arraya;
        var longestarray = arrayb;
    } else {
        var shortestarray = arrayb;
        var longestarray = arraya;
    }

    var subtract = 0;

    for (x = 0; x < shortestarray.length; x++) {

        var theletter = shortestarray[x];
        var thenumber = x;

        if (longestarray.indexOf(theletter, 0) > -1) {

            var index = longestarray.indexOf(theletter, 0);

            longestarray.splice(index, 1);

            subtract = subtract + 2;

        }
    }


    var total = arraylengths - subtract;

    console.log(total);
}
函数main(){
var a=readLine();
var b=readLine();
var arraya=分割(“”);
var arrayb=b.分割(“”);
var ArrayLength=arraya.length+arrayb.length;
//控制台日志(排列长度);
如果(arraya.length-1){
var指数=Longestaray.indexOf(较低者为0);
长排列拼接(索引1);
减法=减法+2;
}
}
var total=阵列长度-减去;
控制台日志(总计);
}

我建议您进行哈希运算。将字符串键的字符及其出现次数设置为值。对两个字符串执行相同的操作。之后,取字符串1并将其每个字符的计数与字符串中相同字符的计数相匹配,然后计算相同字符出现次数的差值,并删除该字符,直到差值变为0,并计算执行删除操作的次数

算法:

step 1: Let arr1[255]= an integer array for storing the count of string1[i]
        and initialized to zero

        ex: string1[i]='a',  then arr1[97]=1, because ASCII value of a is 97  
        and its count is 1. so we made hash table for arr1 where key is 
        ASCII value of character and value is its no of occurrences.

step 2: Now declare an another array of same type and same size for string 2

step 3: For i=0 to length(string1):
               do arr1[string1[i]]++;
step 4: For i=0 to length(string2):
               do arr2[string2[i]]++;

step 5: Declare an boolean char_status[255] array to check if the 
        character is visited or not during traversing and initialize it to 
        false

step 6: set count=0;

step 7: For i=0 to length(string1):
              if(char_status[string1[i]]==false):
                    count=count+abs(arr1[string1[i]]-arr2[string1[i]])
                    char_status[string1[i]]=true

step 8: For i=0 to length(string2):
             if(char_status[string2[i]]==false):
                     count=count+abs(arr1[string2[i]]-arr2[string2[i]])
                     char_status[string2[i]]=true

step 9: print count

我刚刚应用了这个算法,并通过了所有测试用例。如果您有时间,您可以进一步改进此算法。

您的算法很好。它直截了当,容易理解。 您可以做一些事情来提高代码的性能

  • 您不必计算indexOf操作两次。你可以把它减少到一个

  • 拼接操作是成本最高的操作,因为JS引擎必须从数组中删除元素并重新分配所有元素的索引。 这里需要注意的一点是,JS引擎执行了一个额外的步骤来更正数组的索引,这对于您的目的来说不是必需的。因此,您可以安全地删除
    longestarray.splice(索引,1)
    并将其替换为
    删除longestarray[索引]

  • 下面是一个代码片段,它将在不更改逻辑的情况下提高代码的性能

    for (var x = 0; x < shortestarray.length; x++) {
        var theletter = shortestarray[x];    
        var thenumber = longestarray.indexOf(theletter, 0);   // <-- check only once 
        if (thenumber > -1) {
            var index = thenumber;
            delete longestarray[index]; // <-- less costlier than splice
            subtract = subtract + 2;
        }
    }
    
    for(var x=0;xdelete longestarray[index];//您的代码正在超时,因为这不是解决问题的最优雅的方法。通常,黑客银行问题会针对很长的输入测试您的代码,并施加相当短的时间限制,以防止您使用像这样简单但效率低下的算法,并迫使您使用“更好的”你说的是扔掉它,从头开始?我的意思是,它有什么好处吗?我只是说,这不是解决问题的最优雅的方式;请不要把话塞进我的嘴里。为了帮助诊断算法中哪些部分可以改进,请关注数组中每个字符执行的部分;换句话说换句话说,对于那些执行时间与数组长度成正比的部分。Ha抱歉mate。我有点累了。我不是故意这样的。好吧,这是有道理的。谢谢你的建议调试肯定会令人沮丧;不用担心。特别是,你应该注意,
    indexOf
    不是一个固定的时间操作;它实际上每次你调用它时都在搜索整个阵列,因此相当昂贵。这太棒了!非常感谢你的帮助。嗨,克里斯,如果解决方案是正确的,并且对你有帮助。请将其标记为answerHey,很抱歉。新到这个网站。完成了。这是我需要学习的东西。我希望能有足够的能力来帮助你有许多不同的方法来解决问题,因此非常感谢您的意见。:)