Javascript 黑客等级年表
我正在尝试用JavaScript解决这里描述的问题 我必须输出需要从两个字符串中删除的字母数,以便只有匹配的字母(比较两个字符串中的匹配字母,并合计不匹配的字母) 例如 字符串a=cbe 字符串b=abc 两个字符串之间唯一匹配的字母是两个c,因此我将删除4个字母(beab) 我的代码工作正常,但似乎一直超时。如果我下载单个测试用例实例,当变量a和b设置为大字符串时,我似乎失败了。如果我单独测试这些,我似乎得到了正确的输出,但我仍然得到消息“由于超时而终止” 我想可能有人会很清楚为什么我的代码超时了。我不确定这是解决问题最优雅的方式,但我很想让它发挥作用。任何帮助都将不胜感激Javascript 黑客等级年表,javascript,Javascript,我正在尝试用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
我刚刚应用了这个算法,并通过了所有测试用例。如果您有时间,您可以进一步改进此算法。您的算法很好。它直截了当,容易理解。 您可以做一些事情来提高代码的性能
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;x delete longestarray[index];//您的代码正在超时,因为这不是解决问题的最优雅的方法。通常,黑客银行问题会针对很长的输入测试您的代码,并施加相当短的时间限制,以防止您使用像这样简单但效率低下的算法,并迫使您使用“更好的”你说的是扔掉它,从头开始?我的意思是,它有什么好处吗?我只是说,这不是解决问题的最优雅的方式;请不要把话塞进我的嘴里。为了帮助诊断算法中哪些部分可以改进,请关注数组中每个字符执行的部分;换句话说换句话说,对于那些执行时间与数组长度成正比的部分。Ha抱歉mate。我有点累了。我不是故意这样的。好吧,这是有道理的。谢谢你的建议调试肯定会令人沮丧;不用担心。特别是,你应该注意,indexOf
不是一个固定的时间操作;它实际上每次你调用它时都在搜索整个阵列,因此相当昂贵。这太棒了!非常感谢你的帮助。嗨,克里斯,如果解决方案是正确的,并且对你有帮助。请将其标记为answerHey,很抱歉。新到这个网站。完成了。这是我需要学习的东西。我希望能有足够的能力来帮助你有许多不同的方法来解决问题,因此非常感谢您的意见。:)