这是原问题,这是我的解决方案:
function main() {
var m_temp = readLine().split(' ');
var m = parseInt(m_temp[0]);
var n = parseInt(m_temp[1]);
magazine = readLine().split(' ');
ransom = readLine().split(' ');
var freqs = {}
for (var i = 0; i < m; i++){
freqs[magazine[i]] = (freqs[magazine[i]] || 0) + 1;
}
var result = "Yes"
for (var j = 0; j < n; j++){
if (freqs[ransom[j]] && freqs[ransom[j]] > 0){
freqs[ransom[j]] -= 1;
} else {
result = "No"
break;
}
}
console.log(result)
}我想知道是否有比这更有效的解决方案?谢谢!我知道forEach可以用于代码简洁,但我只是使用for循环来获得额外的性能好处(https://coderwall.com/p/kvzbpa/don-t-use-array-foreach-use-for-instead)
发布于 2017-06-14 13:10:45
您的解决方案可能适用于有效的输入,但您并不是在检查无效的输入情况,例如当勒索信中包含的单词比杂志中的单词多时:
if(n > m):
throw new Error("ransom can not be written from magazine");您甚至可以进一步检查第一行是否与它假装的内容相对应:
if (magazine.length !== m)
throw new Error("Wrong words number in magazine");
if (ransom.length !== n)
throw new Error("Wrong words number in ransom");您可以在一行中重构上述条件:
if(n > m || agazine.length !== m || ransom.length !== n):
throw new Error("Invalid input");https://codereview.stackexchange.com/questions/165745
复制相似问题