题干分析:
为什么把这三题放在一起,相信读者从问题的题目上就能看出端倪,但是我这边不想就局限于这三个题目来讲具体的解题过程,我这边想讲一下对于这一类的问题的普适的方法,达到举一反三的目的。
首先我们来一个个的分析问题,找出它们的共性。对于136题,其要求我们找出在给定一个数组的情况下,该数组具有的特征为所有的元素出现的次数都是两次,除了一个元素出现的次数为一,题目要求找出该出现了一次的元素。137题和136题类似,差别在于除了出现一次的其他的元素出现的次数都是三。而260题稍有些区别,260题是其中出现次数为一的元素有两个,而其他元素出现的次数都是两次。
解题分析:
通过分析这三题我们会发现:首先都会在给定一个数组的情况下,然后该数组中的每个元素出现的频次是不一样的,找出其中和其它元素出现频次不相同的一个或几个元素。所有归根结底都是进行数组中元素出现频次的统计,然后找出其中出现频次为1或者为每个固定次数的元素。
对于此类题目如果读者有仔细看小编前几次推送的话一定会想到java中的map集合方法,map中的key来存储唯一的元素,然后value来存储该key对于数组出现的频次。最后我们通过遍历数组找出其中满足固定频次的元素即可。
问题解决:
第136题代码:
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int singleNumber(int[] nums) {
if(nums.length==1)
return nums[0];
Map<Integer,Integer> map1 = new HashMap<Integer,Integer>();
int value1=1;
for(int i=0;i<nums.length;i++){
if(map1.containsKey(nums[i])){
value1=2;
}else
value1=1;
map1.put(nums[i], value1);
}
for(int i=0;i<nums.length;i++){
if(map1.get(nums[i])==1)
return nums[i];
}
return 0;
}
}
第137题代码:
public class Solution {
public int singleNumber(int[] nums) {
if(nums.length==1)
return nums[0];
Map<Integer,Integer> map1 = new HashMap<Integer,Integer>();
int value1=1;
for(int i=0;i<nums.length;i++){
if(map1.containsKey(nums[i])){
value1=3;
}else
value1=1;
map1.put(nums[i], value1);
}
for(int i=0;i<nums.length;i++){
if(map1.get(nums[i])==1)
return nums[i];
}
return 0;
}
}
第260题代码:
public class Solution {
public int[] singleNumber(int[] nums) {
Map<Integer,Integer> map1 = new HashMap<Integer,Integer>();
int value1=1;
for(int i=0;i<nums.length;i++){
if(map1.containsKey(nums[i])){
value1=2;
}else
value1=1;
map1.put(nums[i], value1);
}
int arr[]=new int[2];
int a=0;
for(int i=0;i<nums.length;i++){
if(map1.get(nums[i])==1){
arr[a]=nums[i];
a++;
if(a==2)
return arr;
}
}
return arr;
}
}
本题总结:
-
通过分析LeetCode上的136&137&260题,重新复习和学习了map方法;
-
通过分析这三题总结出了一种解决此类需要进行找出数组中出现特定频次元素的普适的方法(map集合的应用);
-
该方法能够很好的解决此类问题,最终提交代码之后都能击败百分之十左右的对手,击败对手低的原因在于这三题都给出了一些更容易找出元素的条件,如其他的元素出现的频次都是两次之类的,所有存在一些更高效解决问题的方法,但是本方法的普适性更强。
写在最后:读者在读到本文的时候如果有什么想法和问题,欢迎和小编进行沟通交流,希望我们可以共同进步^_^