当前位置:首页 » 《随便一记》 » 正文

Java:Map和Set练习

29 人参与  2024年11月17日 18:02  分类 : 《随便一记》  评论

点击全文阅读


目录

查找字母出现的次数

只出现一次的数字

坏键盘打字


查找字母出现的次数

这道题的思路在后面的题目过程中能用到,所以先把这题给写出来

题目要求:给出一个字符串数组,要求输出结果为其中每个字符串及其出现次数。

思路:我们可以把数组里的字符串按顺序放进map中,对于没被放进去过的字符串,放进去次数为1,之前被放进过去的字符串,那就在其上重新放入,并把次数重新加1.

举个例子,输出的内容是:

"this", "dog", "cat", "cat", "this", "dog"

现在是把每个元素放进去,在没遇到一样数据之前的过程,如是上面所示,如果遇到了一样的数据, 

 

这个操作看起来可能是把第二个cat放进去了,但是实际上是把cat重新输入了,然后把Key值输入为2了。因为map其中节点的样子如上图所示。

代码部分如下

import java.util.HashMap;import java.util.Map;import java.util.Set;public class Test {    public static Map<String, Integer> countWords(String[] words){        Map<String, Integer> map = new HashMap<>();        for(String word : words){            if(map.get(word) == null){                map.put(word, 1);            }else {                int val = map.get(word);                map.put(word, val+1);            }        }        return map;    }    public static void main(String[] args) {        String[] words = {"this", "dog", "cat", "cat", "this", "dog"};        Map<String, Integer> map = countWords(words);        Set<Map.Entry<String, Integer>> entryset = map.entrySet();        for (Map.Entry<String, Integer> entry : entryset){            System.out.println("Key: " + entry + "  Val: " + entry.getKey());        }    }}


只出现一次的数字

题目链接:只出现一次的数字 - 力扣(LeetCode)

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

思路:这里的思路和上面的 查找字母出现的次数 有些像。依次把元素放到set中,如果set中没有该元素,就把该元素放进去,如果有,就把这个元素从set中删去。最后输出set中的元素

以 {1,2,3,4,1,2,3} 为例,当第一次往里放,没有遇到重复的元素时,如下图

按照数组的顺序,接着向下放,就会遇到重复的元素,这时候就要把set中的元素给删除了

 后面的2,3也要依次从set中删除。

public static int singleNumber(int[] nums){        HashSet<Integer> set = new HashSet<>();        for (int i = 0; i < nums.length; i++) {            if(set.contains(nums[i])){                set.remove(nums[i]);            }else{                set.add(nums[i]);            }        }        for (int i = 0; i < nums.length; i++) {            if(set.contains(nums[i])){                return nums[i];            }        }        return -1;    }    public static void main(String[] args) {        int[] array = {1,2,3,4,1,2,3};        System.out.println(singleNumber(array));    }

运行结果如下


坏键盘打字

题目链接:

题目描述:旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

输入在两行中分别给出应该输入的文字、以及实际输入的文字

按照发现顺序,在一行中输出坏掉的键。其中英语字母只输出大写,每个坏键只输入一次。

示例

输入

7_This_is_a_test

_hs_s_a_es

输出

7TI

题目思路:该题的思路在于如何找出坏键,这里提供一种思路,先把实际输入的数据放到set中,然后再把应该输入的文字遍历一遍,如果其中有set中没有的数据,那些没有的数据便是坏掉的键。

public static void func(String str1, String str2){        //将字符串大写        str1 = str1.toUpperCase();        str2 = str2.toUpperCase();        HashSet<Character> setAct = new HashSet<>();        for (int i = 0; i < str2.length(); i++) {            char ch = str2.charAt(i);            setAct.add(ch);        }        for (int i = 0; i < str1.length(); i++) {            char ch = str1.charAt(i);            if(!setAct.contains(ch)){                System.out.print(ch);            }        }    }    public static void main(String[] args) {        func("7_This_is_a_test", "_hs_s_a_es");    }

这样的代码还是存在问题,没办法把其中重复出现的元素给消去,输出的结果是

现在问题变成了如何去重,这部分不难能想到,我们可以创建一个setBroken来存放已经查找到的坏键,如果set和setBroken中都没有这个元素才打印.

public class Test {    public static void func(String str1, String str2){        str1 = str1.toUpperCase(Locale.ROOT);        str2 = str2.toUpperCase(Locale.ROOT);        HashSet<Character> setAct = new HashSet<>();        for (int i = 0; i < str2.length(); i++) {            char ch = str2.charAt(i);            setAct.add(ch);        }        //第一步是把不同的数给挑出来,然后对于重复输出的数据给去重        HashSet<Character> setBroken = new HashSet<>();        for (int i = 0; i < str1.length(); i++) {            char ch = str1.charAt(i);            if(!setAct.contains(ch) && !setBroken.contains(ch)){                setBroken.add(ch);                System.out.print(ch);            }        }    }    public static void main(String[] args) {        func("7_This_is_a_test", "_hs_s_a_es");    }}

输出结果为

这次的内容就到这里,我们下篇文章再见


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/187820.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1