leetCode之Hash相关

2020-09-25  本文已影响0人  Benzic

首页目录 点击查看

第一题:

解题思路

我首先想到遍历数组两次的方法,找到num[j] = traget - num[i],保存后输出两个index.

我的答案

        var twoSum = function (nums, target) {
            for (let i = 0; i <= nums.length - 1; i++) {
                for (let j = i + 1; j <= nums.length - 1; j++) {
                    if (nums[i] === target - nums[j]) {
                        return [ i, j]
                        break
                    }
                }
            }
        };

当然我也想出了另外一种方案,只需要一个for循环,用一个对象角标来保存目标数值: 这种方法从时间复杂度上只需要O(N)

        var twoSum = function (nums, target) {
            let useNum = {}
            for (let i = 0; i <= nums.length - 1; i++) {
                const currentNum = nums[i];
                const targetNum = target - currentNum;
                const targetIndex = useNum[targetNum]
                if (targetIndex !== undefined) {
                    return [targetIndex, i]
                    break
                }
                useNum[currentNum] = i
            }
        };

第二题

示例

输入:S = "ababcbacadefegdehijhklij"
输出:[9,7,8]
解释:
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

解题思路

我的答案

var partitionLabels = function (S) {
    let map = {}
    let arr = []
    let start = 0
    for (let i = 0; i <= S.length - 1; i++) {
        map[S[i]] = i;
    }
    let splitIndex = 0;
    for (let i = 0; i <= S.length; i++) {
        let lastIndex = map[S[i]];
        splitIndex = Math.max(splitIndex, lastIndex);
        if (i === splitIndex) {
            arr.push(i - start + 1);
            start = i + 1
        }
    }
    return arr
};
image.png

第三题

示例

输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

解题思路

我的答案

var groupAnagrams = function (strs) {
    let map = {};
    let array = []
    for (let i = 0; i <= strs.length - 1; i++) {
        let sortStr = strs[i].split("").sort((a, b) => {
            return a > b ? 1 : -1
        }).join("")
        !map[sortStr] && (map[sortStr] = []);
        map[sortStr].push(strs[i])
    }
    for (let i in map) {
        array.push(map[i])
    }
    return array
};
image.png

第四题

示例

输入: s = "anagram", t = "nagaram"
输出: true

输入: s = "rat", t = "car"
输出: false

解题思路

我的答案

        var isAnagram = function (s, t) {
            let sStr = s.split("").sort((a, b) => {
                return a > b ? 1 : -1
            }).join("");
            let tStr = t.split("").sort((a, b) => {
                return a > b ? 1 : -1
            }).join("");
            return sStr === tStr
        };
image.png
        var isAnagram = function (s, t) {
            if (s.length !== t.length) {
                return false
            }
            let hash = new Array(26).fill(0);
            let codeA = "a".charCodeAt()
            for (let i = 0; i <= s.length - 1; i++) {
                hash[s.charCodeAt(i) - codeA]++;
                hash[t.charCodeAt(i) - codeA]--;
            }
            for (let i in hash) {
                if (hash[i]) {
                    return false
                }
            }
            return true
        };
image.png

第五题

示例

输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。

输入:n = 0
输出:0

解题思路

我的答案

        var countPrimes = function (n) {
            if (n < 3) {
                return 0
            }
            let num = 1;
            for (let i = 3; i <= n - 1; i++) {
                if (i % 2 == 0)      //过滤掉偶数,2 因为默认num就是1了所以也算在其中了。
                    continue;;
                let flag = true
                for (let j = 3; j * j <= i; j += 2) {
                    if (i % j === 0) {
                        flag = false
                        break;
                    }
                }
                if (flag) {
                    num += 1
                }
            }
            return num
        };
image.png
        var countPrimes = function (n) {
            let num = 0;
            let map = new Array(n).fill(false);
            for (let i = 2; i <= n - 1; i++) {
                if (!map[i]) {
                    num += 1;
                    for (let j = i + i; j <= n - 1; j += i) {
                        map[j] = true
                    }
                }
            }
            return num
        }
image.png

第六题

示例

输入: secret = "1807", guess = "7810"
输出: "1A3B"
解释: 1 公牛和 3 奶牛。公牛是 8,奶牛是 0, 1 和 7。

输入: secret = "1123", guess = "0111"
输出: "1A1B"
解释: 朋友猜测数中的第一个 1 是公牛,第二个或第三个 1 可被视为奶牛。

解题思路

我的答案

var getHint = function (secret, guess) {
    let ANum = 0;
    let BNum = 0;
    let mapS = {};
    let mapG = {}
    for (let i = 0; i <= secret.length - 1; i++) {
        if (secret[i] === guess[i]) {
            ANum += 1
        } else {
            !mapS[secret[i]] && (mapS[secret[i]] = 0);
            !mapG[guess[i]] && (mapG[guess[i]] = 0);
            mapS[secret[i]] += 1;
            mapG[guess[i]] += 1;
        }
    }
    for (let i in mapG) {
        if (mapS[i]) {
            BNum += Math.min(mapS[i], mapG[i])
        }
    }
    return ANum + "A" + BNum + "B"
};
image.png

第七题

示例

输入: [[1,2,2,1],
      [3,1,2],
      [1,3,2],
      [2,4],
      [3,1,2],
      [1,3,1,1]]

输出: 2

解释: 
![image.png](https://img.haomeiwen.com/i2669301/0094d2db4bc94c64.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

解题思路

我的答案

var leastBricks = function (wall) {
    let map = {}
    let max = 0
    for (let i = 0; i <= wall.length - 1; i++) {
        let sum = 0
        for (let j = 0; j < wall[i].length - 1; j++) {
            sum += wall[i][j]
            !map[sum] && (map[sum] = 0);
            map[sum] += 1
            max = Math.max(map[sum], max)
        }
    }
    return wall.length - max
};
image.png
上一篇 下一篇

猜你喜欢

热点阅读