我正在准备接受关于《黑客排名》的preparation questions采访,我想在此方面做得更好。是否有可能对此获得一些反馈?如何改善我的代码?您是如何解决this问题的?
function getCount(array){
let counts = {}
for(let word of array){
let count = counts[word]
counts[word] = count ? counts[word] + 1: 1;
}
return counts
}
// Complete the checkMagazine function below.
function compareNoteMag(note,mag){
let noteKeys = Object.keys(note)
let string = 'Yes'
for(let key of noteKeys){
if(!mag[key]) string = 'No'
if(mag[key] < note[key]){
string = 'No'
}
}
console.log(string)
}
function checkMagazine(magazine, note) {
let magazineCount = getCount(magazine);
let noteCount = getCount(note);
compareNoteMag(noteCount,magazineCount)
};
答案 0 :(得分:0)
给出几个具有时间复杂度的解决方案示例,这可能会有所帮助
解决方案 1 : 这对于几个测试用例是可以的,但是你会失败一些测试用例,如下所示 限制随着杂志数量和笔记长度的增加在hackerank设置的时间限制内无法执行https://www.hackerrank.com/environment
function checkMagazine(magazine, note) {
for (var i = 0; i <= note.length; i++) { //O(n)
for (var j = 0; j <= magazine.length; j++) { //O(n)
if (note[i] == magazine[j]) {
magazine.splice(magazine.indexOf(magazine[j]), 1) //O(n)
note.splice(note.indexOf(note[i]), 1) //O(n)
}
}
}
let result = (note.length > 0) ? "No" : "Yes"
console.log(result)
}
解决方案 2 :与解决方案 1 相比更好,但这也会使某些测试用例失败
function checkMagazine(magazine, note) {
let result = "Yes"
note.forEach((n) => { //O(n)
if (magazine.includes(n)) { //O(n)
magazine.splice(magazine.indexOf(n), 1) //O(n)
}
else {
result = "No"
return
}
})
console.log(result)
}
解决方案 3 : 上面两个更好,这应该通过所有测试用例,因为这里我们使用 js 对象,哪种 HashTable 所以访问元素成本 u O(1)
function checkMagazine(magazine, note) {
let hash_mag = {}
let result = "Yes"
magazine.forEach((m)=>{ //O(n)
hash_mag[m] = hash_mag[m] ? hash_mag[m]+1 : 1
})
note.forEach((n) => { //O(n)
if (hash_mag[n]>0) { //O(1)
hash_mag[n] = hash_mag[n] - 1 //O(1)
}
else {
result = "No"
return
}
})
console.log(result)
}