数据结构(十四)——HashMap与HashSet(OJ题)
一.只出现一次的数字
136. 只出现一次的数字 - 力扣(LeetCode)
给你一个 非空 整数数组
nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1] 输出:1示例 2 :
输入:nums = [4,1,2,1,2] 输出:4示例 3 :
输入:nums = [1] 输出:1
class Solution {public int singleNumber(int[] nums) {HashSet<Integer> set=new HashSet<>();for(int x:nums){if(!set.contains(x)){set.add(x);}elseset.remove(x);}for(int x:nums){if(set.contains(x))return x;}return -1;}
}
二、字符串中的第一个唯一字符
387. 字符串中的第一个唯一字符 - 力扣(LeetCode)
给定一个字符串 s
,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1
。
示例 1:
输入: s = "leetcode" 输出: 0示例 2:
输入: s = "loveleetcode" 输出: 2示例 3:
输入: s = "aabb" 输出: -1
思路:
先定义一个数组,然后直接遍历字符串记录下每个元素出现的次数,再次遍历字符串,注意这里不是遍历数组,因为字符串的第一个不重复元素可能在数组中存储位置并不一定是第一位,所谓我们还是遍历字符串,找到出现次数为1的那个元素并输出。
class Solution {public int firstUniqChar(String s) {int[] arr = new int[26];for(int i= 0;i<s.length();i++){arr[s.charAt(i) -'a']++;}for(int i= 0;i<s.length();i++){if(arr[s.charAt(i) -'a'] == 1){return i;}}return -1;}
}
三.宝石与石头
给你一个字符串
jewels
代表石头中宝石的类型,另有一个字符串stones
代表你拥有的石头。stones
中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。字母区分大小写,因此
"a"
和"A"
是不同类型的石头。
示例 1:
输入:jewels = "aA", stones = "aAAbbbb" 输出:3示例 2:
输入:jewels = "z", stones = "ZZ" 输出:0
class Solution {public int numJewelsInStones(String jewels, String stones) {Set<Character> set = new HashSet<>();for(char ch:jewels.toCharArray()){set.add(ch);}int count=0;for(char ch:stones.toCharArray()){if(set.contains(ch))count++;}return count;}
}