算法-技巧-简单-只出现一次的数字、多数元素

 记录一下算法题的学习10

只出现一次的数字

leetcode题目:给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间

技巧  位运算 异或运算 Java中异或运算符^  异或运算性质三种

  • 任何数和0做异或运算,结果仍然是原来的数,即 a⊕0=a。
  • 任何数和其自身做异或运算,结果是 0,即 a⊕a=0。
  • 异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。

代码展示

class Solution {
    public int singleNumber(int[] nums) {
       int sole=0;
       //遍历整个数组里的元素,由于题目所给条件除了某个元素只出现一次以外,其余每个元素均出现两次
       //合理使用异或运算的特点
       //我们最终获得的就是只出现一次的元素
       for(int num=0;num

 多数元素

leetcode题目:给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

1.摩尔投票法  核心理念为 票数正负抵消

  • 候选人(candidates)初始化为 nums[0],票数 count 初始化为 1。
  • 当遇到与candidates 相同的数,则票数 count = count + 1,否则票数 count = count - 1。
  • 当票数 count 为 0 时,更换候选人,并将票数 count 重置为 1。
  • 遍历完数组后,candidates 即为最终答案
class Solution {
    public int majorityElement(int[] nums) {
      int candidates= nums[0], count = 1;
        for (int i = 1; i < nums.length; ++i) {
            if (candidates == nums[i])
                count+=1;
            else if ( --count == 0) {
                candidates = nums[i];
                count = 1;
            }
        }
        return candidates;
    }
}

2.数组排序法  将数组 nums 排序,数组中点的元素 一定为众数。代码展示

class Solution {
    public int majorityElement(int[] nums) {
      //数组升序
      Arrays.sort(nums);
      int most_number=0; //初始化多数元素--》众数为0
      most_number=nums[nums.length/2]; //将数组 nums 排序,数组中点的元素 一定为众数。
      return most_number;
    }
}
class Solution {
    public int majorityElement(int[] nums) {
      //数组降序 jdk8使用
      Integer[] integers = Arrays.stream(nums).boxed().toArray(Integer[]::new);
      Arrays.sort(integers ,Collections.reverseOrder ());
      int most_number=0; //初始化多数元素--》众数为0
      most_number=integers[integers.length/2]; //将数组 nums 排序,数组中点的元素 一定为众数。
      return most_number;
    }
}

 注意

  •  如果想要使用降序:Arrays.sort(scores,Collections.reverseOrder());。
  • 首先要注意的是不能用int这个类型了,要用Integer,不能使用基本类型(int,double, char)
  • 如果是int型需要改成Integer,float要改成Float

举例Integer[] 和int[] 互转 jdk8使用Stream流来实现互相转化

// int[] --> Integer[]
int[] arr = {1, 2, 3, 4, 5};
Integer[] integers = Arrays.stream(nums).boxed().toArray(Integer[]::new);
// Integer[] --> int[]
int[] nums = Arrays.stream(integers).mapToInt(Integer::valueOf).toArray();

3.哈希表统计法: 遍历数组 nums ,用 HashMap 统计各数字的数量,即可找出众数

方法 作用
getOrDefault()  获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
hashmap.getOrDefault(Object key, V defaultValue)
Map.Entry Map声明的一个内部接口,此接口为泛型,定义为Entry。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。
map.entrySet()

java中 键-值 对的集合,Set里面的类型是Map.Entry,一般可以通过map.entrySet()得到。

entrySet实现了Set接口,里面存放的是键值对。一个K对应一个V

class Solution {
    public int majorityElement(int[] nums) {
       HashMap map=new HashMap<>();//建立一个哈希表
       for(int i=0;i entry:map.entrySet()){
            if(entry.getValue()>value){
                value = entry.getValue();
                key = entry.getKey();
            }
       }
       return key;
    }
}

 结束拜拜!

你可能感兴趣的:(算法,数据结构,leetcode,java)