问题形容~只呈现一次的数字

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

阐明:
你的算法应该具备线性工夫复杂度。 你能够不应用额定空间来实现吗?

示例 1:

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

示例 2:

输出: [4,1,2,1,2]输入: 4
力扣原题目地址:https://leetcode.cn/problems/...

解决方案

计划一 应用map统计各个项呈现的次数,看谁呈现的次数是一

var singleNumber = function (nums) {    let map = new Map() // 1. 创立一个map用来统计数据    for (let i = 0; i < nums.length; i++) { // 2. 遍历数组开始统计        // 3. 一开始map汇合是空的,所以持续往下看        if (map.has(nums[i])) { // 5. 后续来了一项,新来的这一项原汇合中有一样的项            let conut = map.get(nums[i]) // 6. 就看看原汇合中这一项呈现了几次            conut = conut + 1 // 7. 把原有次数新增一次            map.set(nums[i], conut) // 8. 而后更新次数        } else { // 4. 来一项,就把这一项存进map外面,key是这一项,value是这一项呈现的次数            map.set(nums[i], 1)        }    }    // 9. 通过这么一波操作,map汇合中就记录了,各个项呈现的次数了    for (const [key, value] of map) { // 10. 应用forof遍历汇合        if (value === 1) { // 11. 看看谁呈现的次数是一次            return key // 12. 就把对应项返回进来告知即可        }    }};

当然这里也能够应用对象去统计次数,一个情理,在此不赘述

计划二 若某一项只呈现了一次则indexof和lastIndexOf值相等

  • 若某个数只呈现了一次,则indexof和lastIndexOf的值必然相等
  • 若某个数呈现了两次,则indexof和lastIndexOf的值必然不相等
var singleNumber = function (nums) {    for (let i = 0; i < nums.length; i++) {        let item = nums[i]        if (nums.indexOf(item) === nums.lastIndexOf(item)) {            return item        }    }};

留神:indexof和lastIndexOf的区别:

  • indexof查问的某个元素首次呈现的索引(从左往右查)
  • lastIndexOf某个元素最初一次呈现的地位(区别就是从右往左查)
  • 二者返回的索引,都是从左往右走的索引

计划三 应用异或运算(官网举荐)

这个异或运算确实没怎么想到,异或规定,简要如下:

  • 任何数值异或0等于数值它自身
  • 两个数值的异或,雷同为0,相异为1

故代码如下:

var singleNumber = function (nums) {    let val = 0; // 1. 定义初始值为0    nums.forEach((item) => {        val = val ^ item // 2. 循环异或    })    return val // 3. 最终的值就是后果};

问题形容~少数元素

这个少数元素的题目也能够应用统计次数的思路去实现

给定一个大小为 n 的数组 nums ,返回其中的少数元素。少数元素是指在数组中呈现次数 大于 ⌊ n/2 ⌋ 的元素。

你能够假如数组是非空的,并且给定的数组总是存在少数元素。

示例 1:

输出:nums = [3,2,3]输入:3

示例 2:

输出:nums = [2,2,1,1,1,2,2]输入:2
力扣原题目地址:https://leetcode.cn/problems/...

解决方案

计划一,应用map统计次数,并比照是否大于数组长度的一半

var majorityElement = function (nums) {    let map = new Map()    for (let i = 0; i < nums.length; i++) {        if (map.has(nums[i])) {            let conut = map.get(nums[i])            conut = conut + 1            map.set(nums[i], conut)        } else {            map.set(nums[i], 1)        }    }    for (const [key, value] of map) {        if (value > nums.length / 2) {            return key        }    }};

计划二,中位数断定

找法则:

如果有一个数字呈现的频率大于n/2,也就是说,这个数字呈现了很屡次,比方有五个雪糕,有三个都是小布丁。

那么就是找到雪糕的两头数,即可找到这个呈现次数超过n/2的数。所以先排序,而后再取两头数即可

var majorityElement = function (nums) {    nums.sort(function (a, b) { // 1. 排个序        return a - b    })    let middle = Math.floor(nums.length / 2) // 2. 取到两头数    return nums[middle] // 3. 返回就是}

总结

题目不难,办法有很多种,不过咱们还是要预留一种保底的办法,就是应用map汇合进行统计的形式。

毕竟面试中,可能比拟缓和,其余的一些形式可能想不起来了