哈希表:勒索笔记-Java黑客排名

时间:2018-07-21 12:40:19

标签: javascript arrays hashmap

我正在准备接受关于《黑客排名》的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)
};

1 个答案:

答案 0 :(得分:0)

给出几个具有时间复杂度的解决方案示例,这可能会有所帮助

解决方案 1 : 这对于几个测试用例是可以的,但是你会失败一些测试用例,如下所示 限制随着杂志数量和笔记长度的增加在hackerank设置的时间限制内无法执行https://www.hackerrank.com/environment

enter image description here

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)
}