飞道的博客

Leetcode哈希表题(java作答)

467人阅读  评论(0)

目录

136.只出现一次的数字

202.快乐数

219.存在重复元素II

205.同构字符串

242.有效的字母异位词

299.猜数字游戏

290.单词规律


136.只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1
示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number


  
  1. class Solution {
  2. public int singleNumber(int[] nums) {
  3. HashSet<Integer> hs1= new HashSet<Integer>();
  4. for( int i:nums){
  5. if(hs1.contains(i)){
  6. hs1.remove(i);
  7. } else{
  8. hs1.add(i);
  9. }
  10. }
  11. Iterator<Integer> it=hs1.iterator();
  12. return ( int)it.next();
  13. }
  14. }

202.快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为  1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/happy-number


  
  1. class Solution {
  2. public boolean isHappy(int n) {
  3. HashSet<Integer> hset1= new HashSet<Integer>();
  4. while( true){
  5. if(n== 1){
  6. break;
  7. }
  8. if(hset1.contains(n)){
  9. return false;
  10. } else{
  11. hset1.add(n);
  12. n=sunOfsquares(n);
  13. }
  14. }
  15. return true;
  16. }
  17. public int sunOfsquares(int n){
  18. int sum = 0;
  19. while( true ){
  20. if( n== 0 ){
  21. break;
  22. }
  23. sum += Math.pow( n% 10 , 2 );
  24. n /= 10;
  25. }
  26. return sum;
  27. }
  28. }

219.存在重复元素II

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。

 

示例 1:

输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:

输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:

输入: nums = [1,2,3,1,2,3], k = 2
输出: false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/contains-duplicate-ii


  
  1. class Solution {
  2. public boolean containsNearbyDuplicate(int[] nums, int k) {
  3. if(k== 0){
  4. return false;
  5. }
  6. HashSet<Integer> hset1= new HashSet<Integer>();
  7. for( int i= 0;i<nums.length;i++){
  8. if(hset1.contains(nums[i])){
  9. return true;
  10. } else{
  11. if(i>=k){
  12. hset1.remove(nums[i-k]);
  13. }
  14. hset1.add(nums[i]);
  15. }
  16. }
  17. return false;
  18. }
  19. }

205.同构字符串

给定两个字符串 s 和 t,判断它们是否是同构的。

如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。

所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。

示例 1:

输入: s = "egg", t = "add"
输出: true
示例 2:

输入: s = "foo", t = "bar"
输出: false
示例 3:

输入: s = "paper", t = "title"
输出: true
说明:
你可以假设 s 和 t 具有相同的长度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/isomorphic-strings


  
  1. class Solution {
  2. public boolean isIsomorphic(String s, String t) {
  3. HashMap<Character,Character> hstab1 = new HashMap<Character,Character>();
  4. for( int i= 0;i<s.length();i++){
  5. char s_char=s.charAt(i);
  6. char t_char=t.charAt(i);
  7. if(!hstab1.containsKey(s_char)){
  8. if(hstab1.containsValue(t_char)){
  9. return false;
  10. }
  11. hstab1.put(s_char,t_char);
  12. } else if(hstab1.get(s_char)!=t_char){
  13. return false;
  14. }
  15. }
  16. return true;
  17. }
  18. }

242.有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:

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

输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。

进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-anagram


  
  1. class Solution {
  2. public boolean isAnagram(String s, String t) {
  3. if(s.length()!=t.length()){
  4. return false;
  5. }
  6. HashMap<Character,Integer> map_s = new HashMap<Character,Integer>();
  7. HashMap<Character,Integer> map_t = new HashMap<Character,Integer>();
  8. char sc= ' ';
  9. char tc= ' ';
  10. for( int i= 0;i<s.length();i++){
  11. sc=s.charAt(i);
  12. tc=t.charAt(i);
  13. if(map_s.containsKey(sc)){
  14. map_s.put(sc,map_s.get(sc)+ 1);
  15. } else{
  16. map_s.put(sc, 1);
  17. }
  18. if(map_t.containsKey(tc)){
  19. map_t.put(tc,map_t.get(tc)+ 1);
  20. } else{
  21. map_t.put(tc, 1);
  22. }
  23. }
  24. return map_s.equals(map_t);
  25. }
  26. }

299.猜数字游戏

你正在和你的朋友玩 猜数字(Bulls and Cows)游戏:你写下一个数字让你的朋友猜。每次他猜测后,你给他一个提示,告诉他有多少位数字和确切位置都猜对了(称为“Bulls”, 公牛),有多少位数字猜对了但是位置不对(称为“Cows”, 奶牛)。你的朋友将会根据提示继续猜,直到猜出秘密数字。

请写出一个根据秘密数字和朋友的猜测数返回提示的函数,用 A 表示公牛,用 B 表示奶牛。

请注意秘密数字和朋友的猜测数都可能含有重复数字。

示例 1:

输入: secret = "1807", guess = "7810"

输出: "1A3B"

解释: 1 公牛和 3 奶牛。公牛是 8,奶牛是 0, 1 和 7。
示例 2:

输入: secret = "1123", guess = "0111"

输出: "1A1B"

解释: 朋友猜测数中的第一个 1 是公牛,第二个或第三个 1 可被视为奶牛。
说明: 你可以假设秘密数字和朋友的猜测数都只包含数字,并且它们的长度永远相等。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bulls-and-cows


  
  1. class Solution {
  2. public String getHint(String secret, String guess) {
  3. int numsBulls= 0;
  4. int numsCows= 0;
  5. ArrayList<Character> lst = new ArrayList<Character>();
  6. HashMap<Character,Integer> map = new HashMap<Character,Integer>();
  7. for( int i= 0;i<guess.length();i++){
  8. if(secret.charAt(i)==guess.charAt(i)){
  9. numsBulls++;
  10. } else{
  11. if(map.containsKey(secret.charAt(i))){
  12. map.put(secret.charAt(i),map.get(secret.charAt(i))+ 1);
  13. } else{
  14. map.put(secret.charAt(i), 1);
  15. }
  16. lst.add(guess.charAt(i));
  17. }
  18. }
  19. for( char c:lst){
  20. if(map.containsKey(c)){
  21. map.put(c,map.get(c)- 1);
  22. numsCows++;
  23. if(map.get(c)== 0){
  24. map.remove(c);
  25. }
  26. }
  27. }
  28. return ""+numsBulls+ "A"+numsCows+ "B";
  29. }
  30. }

290.单词规律

给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

示例1:

输入: pattern = "abba", str = "dog cat cat dog"
输出: true
示例 2:

输入:pattern = "abba", str = "dog cat cat fish"
输出: false
示例 3:

输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false
示例 4:

输入: pattern = "abba", str = "dog dog dog dog"
输出: false
说明:
你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。    

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-pattern


  
  1. class Solution {
  2. public boolean wordPattern(String pattern, String str) {
  3. ArrayList<String> words = new ArrayList<String>();
  4. String word = "";
  5. for( int i= 0;i<str.length();i++){
  6. if(str.charAt(i)!= ' '){
  7. word+=str.charAt(i);
  8. }
  9. if(str.charAt(i)== ' '||i==str.length()- 1){
  10. words.add(word);
  11. word = "";
  12. }
  13. }
  14. if(pattern.length()!=words.size()){
  15. return false;
  16. }
  17. HashMap<Character,String> map = new HashMap<Character,String>();
  18. for( int i= 0;i<pattern.length();i++){
  19. if(map.containsKey(pattern.charAt(i))){
  20. if(!map.get(pattern.charAt(i)).equals(words.get(i))){
  21. return false;
  22. }
  23. } else{
  24. if(map.containsValue(words.get(i))){
  25. return false;
  26. }
  27. map.put(pattern.charAt(i),words.get(i));
  28. }
  29. }
  30. return true;
  31. }
  32. }

 


转载:https://blog.csdn.net/qq_45384304/article/details/105631573
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场