LeetCode--HashMap


一、剑指 Offer 03. 数组中重复的数字

剑指 Offer 03. 数组中重复的数字

找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000

思路

1.hashset存储出现的数字,遇到重复即可返回结果。

class Solution {
    public int findRepeatNumber(int[] nums) { 
        HashSet<Integer> count = new HashSet<>();
        int len = nums.length;
        for (int i = 0;i < len;i++) {
            if (count.contains(nums[i])) return nums[i];
            else count.add(nums[i]);
        }
        return 0;
    }
}

2.利用题意长度为n的数组nums所有数字在0~n-1范围内,所以数字与下标是一一对应的关系,即将下标不匹配的数字换回到正确的位置,如果位置下标与数字已经对应了则说明当前数字是多余的,也就是重复了。

class Solution {
    public int findRepeatNumber(int[] nums) {
        
        int len = nums.length;
        for (int i = 0;i < len;i++) {
            if (nums[i] == i) {
                continue;
            }
            else {
                if (nums[nums[i]] == nums[i]) return nums[i];
                int temp = nums[nums[i]];
                nums[nums[i]] = nums[i];
                nums[i] = temp;
            }  
        }
        return -1;
    }
}

二、剑指 Offer 48. 最长不含重复字符的子字符串

剑指 Offer 48. 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
提示:
s.length <= 40000

思路
1.使用HashMap记录字符最后一次出现的位置,遍历字符串,当遇到之前出现过的字符,更新最长字符串的长度

class Solution {
    public int lengthOfLongestSubstring(String s) {
		Map<Character, Integer> dic = new HashMap<>();
        char[] ss = s.toCharArray();
        int i = -1, res = 0;
        for (int j =0 ;j < ss.length;j++) {
            i = Math.max(i,dic.getOrDefault(ss[j],-1));
            dic.put(ss[j],j);
            res = Math.max(res,j -i);
        }
        return res;
    }
}

三、剑指 Offer 50. 第一个只出现一次的字符

剑指 Offer 50. 第一个只出现一次的字符

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例:
s = “abaccdeff”
返回 “b”
s = “”
返回 " "

思路
1.使用String API的方法,indexOf()和lastIndexOf()方法,循环26次找出indexOf()最小的那个,时间O1

class Solution {
    public char firstUniqChar(String s) {
        int target=s.length();
        //找出第一个不重复的字符
        for (int i='a';i<='z';i++){
            int index=s.indexOf(i);
            if(index!=-1&&index==s.lastIndexOf(i)&&index<target){
                target=index;
            }
        }
        if(target==s.length()){
            return ' ';
        }
        return s.charAt(target);
    }
}

2.使用(hashMap)数组统计出现的字符串的,再遍历一遍字符数组,找到第一个出现一次的字符

class Solution {
    public char firstUniqChar(String s) {
        int[] num = new int[26];
        char[] ss = s.toCharArray();
        for(int i = 0 ;i < ss.length;i++) {
            num[ss[i]-'a']++; 
        }
        for(int i = 0 ;i < ss.length;i++) {
            if(num[ss[i]-'a'] == 1) return ss[i]; 
        }
        return ' ';
    }
}

总结

HashMap可以使查找复杂度为O1, getOrdefault(x,y)方法设置查询不到的默认值
  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页

打赏

cainaio程序猿

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者