【算法面试题汇总】LeetBook列表的算法面试题汇总---哈希与映射题目及答案

整理不易留个小心心呗
如果有更好的或者是我有错的地方还请各位大佬指出哦
有些是copy的还望不要介意

哈希与映射

      • Excel表列序号
      • 四数相加Ⅱ
      • 常数时间插入、删除和获取随机元素

Excel表列序号

题目描述:
给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号

例如:

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28 
...

示例:

输入: columnTitle = "A"
输出: 1

提示:

1 <= columnTitle.length <= 7
columnTitle 仅由大写英文组成
columnTitle 在范围 ["A", "FXSHRXW"] 内
  • 代码实现
class Solution {
    public int titleToNumber(String columnTitle) {
        int n = columnTitle.length();
        int ans = 0;
        for(int i=0;i<n;i++){
            //A为1所以要+1
            //因为有26个字母,相当于26进制,每26个数则向前一位
            //ZY:26 * 26 + 25=701  
            ans = ans*26 + (columnTitle.charAt(i) - 'A' + 1);
        }
        return ans;
    }
}
  • 写法二
class Solution {
    public int titleToNumber(String columnTitle) {
        int ans = 0;
        int multiple = 1;
        for (int i = columnTitle.length() - 1; i >= 0; i--) {
            //ZY:26*26 + 26⁰*25
            int k = columnTitle.charAt(i) - 'A' + 1;
            ans += k * multiple;
            multiple *= 26;
        }
        return ans;
    }
}

四数相加Ⅱ

题目描述:

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

示例:

输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
输出:2
解释:
两个元组如下:
1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
  • 代码实现
class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer,Integer> map = new HashMap<>();
        //计算nums1和nums2的和,与nums3和nums4的和的负值相等则=0
        for(int A : nums1){
            for(int B : nums2){
                int sum = A+B;
                map.put(sum,map.getOrDefault(sum,0)+1);
            }
        }
        int count = 0;
        for(int C:nums3){
            for(int D:nums4){
                int sum = -(C+D);
                if(map.containsKey(sum)){
                    //加的是nums1和nums2的和出现的次数
                    count += map.get(sum);
                }
            }
        }
        return count;
    }
}

常数时间插入、删除和获取随机元素

题目描述:

实现RandomizedSet 类:

RandomizedSet() 初始化 RandomizedSet 对象
bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;
					否则,返回 false 。
bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;
					否则,返回 false 。
int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。

你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1)

示例:

输入
["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"]
[[], [1], [2], [2], [], [1], [2], []]
输出
[null, true, false, true, 2, true, false, 2]

解释
RandomizedSet randomizedSet = new RandomizedSet();
randomizedSet.insert(1); // 向集合中插入 1 。返回 true 表示 1 被成功地插入。
randomizedSet.remove(2); // 返回 false ,表示集合中不存在 2 。
randomizedSet.insert(2); // 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。
randomizedSet.getRandom(); // getRandom 应随机返回 1 或 2 。
randomizedSet.remove(1); // 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。
randomizedSet.insert(2); // 2 已在集合中,所以返回 false 。
randomizedSet.getRandom(); // 由于 2 是集合中唯一的数字,getRandom 总是返回 2 。

  • 代码实现
class RandomizedSet {
    List<Integer> nums;//存放值
    Map<Integer,Integer> map;//记录值和下标
    Random random;

    public RandomizedSet() {
        nums = new ArrayList<>();
        map = new HashMap<>();
        random = new Random();
    }
    
    public boolean insert(int val) {
        if(!map.containsKey(val)){
            map.put(val,nums.size());
            nums.add(val);
            return true;
        }
        return false;
    }
    
    public boolean remove(int val) {
        if(map.containsKey(val)){
            int index = map.get(val);
            int last = nums.get(nums.size()-1);
            //将要删除的值改为数组最后一个值
            nums.set(index,last);
            map.put(last,index);
            //删除最后一个值
            //因为不在乎顺序,交换最后一个值,删除就为O(1)
            nums.remove(nums.size()-1);
            map.remove(val);
            return true;
        }
        return false;
    }
    
    public int getRandom() {
        int randomIndex = random.nextInt(nums.size());
        return nums.get(randomIndex);
    }
}

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * RandomizedSet obj = new RandomizedSet();
 * boolean param_1 = obj.insert(val);
 * boolean param_2 = obj.remove(val);
 * int param_3 = obj.getRandom();
 */

你可能感兴趣的:(数据结构与算法,算法,java,哈希)