目录
查找字母出现的次数
这道题的思路在后面的题目过程中能用到,所以先把这题给写出来
题目要求:给出一个字符串数组,要求输出结果为其中每个字符串及其出现次数。
思路:我们可以把数组里的字符串按顺序放进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());
}
}
}
只出现一次的数字
题目描述:给一个 非空 整数数组 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");
}
}
输出结果为
这次的内容就到这里,我们下篇文章再见