JS算法-只出现一次的数字

简介: JS算法-只出现一次的数字

题目


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

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


题目解析


第一种


定义函数 singleNumber,并接收一个参数 nums,代表一个整数类型的数组。创建一个空的Map数据结构 map。使用for循环遍历数组 nums 中的每一个元素。对于每个数组元素,做以下判断:如果 map 中已经存在当前元素,则将该元素对应的value加1。如果 map 中不存在当前元素,则将该元素添加到 map 中,并将它的value设置为1。使用for..of循环遍历 map 中的所有条目。对于每个条目,判断它的value是否等于1。如果条目的value等于1,则返回该条目的key作为结果,即找到了只出现一次的数字

var singleNumber = function(nums) {
    let map = new Map()
    for (let i=0; i<nums.length; i++) {
       if (map.has(nums[i])) {
            map.set(nums[i], map.get(nums[i])+1)
        } else {
            map.set(nums[i], 1)
        } 
    }
    for (let item of map.entires()) {
        if (item[1] == 1) {
          return item[0]   
         }
    }
};


第二种


首先需要对数组进行排序,这样相同的元素就都在一起了。定义三个变量:cur表示当前遍历到的数,index表示当前遍历到的元素的下标,cnt表示当前遍历到的数出现的次数。使用循环遍历整个排序后的数组。循环的条件是index小于数组的长度。判断cur和nums[index]是否相等。如果相等,说明当前遍历到的数已经出现过了,所以计数器cnt加1,同时将index指向下一个元素。如果cur和nums[index]不相等,说明当前遍历到了一个新数。那么就需要判断之前遍历到的数cur的出现次数是否是1。如果是1,说明cur就是只出现1次的数,直接返回即可。如果cur的出现次数不是1,说明需要继续找,要重新设定cur的值、cnt的值,继续循环。最后,如果遍历完整个数组,最后一个数仍然出现次数大于1,那么这个数就是要找的只出现1次的数,返回cur即可

var singleNumber = function(nums) {
    nums.sort((a,b)=>a-b)
    let cur = nums[0],index = 1,cnt = 1
    while(index < nums.length){
        if(cur == nums[index]){
            cnt++
            index++
        }else{
            if(cnt <= 1){
                return cur
            }else{
                cur = nums[index]
                cnt = 1
                index++
            }
        }
    }
    return cur
};
相关文章
|
13天前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
13天前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
22天前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
36 1
|
2月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
43 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
|
2月前
|
算法 JavaScript
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
JS 【详解】二叉树(含二叉树的前、中、后序遍历技巧和算法实现)
32 0
|
2月前
|
算法 JavaScript
JS 【算法】二分查找
JS 【算法】二分查找
23 0
|
2月前
|
缓存 算法 前端开发
前端 JS 经典:LRU 缓存算法
前端 JS 经典:LRU 缓存算法
33 0
|
6天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
6天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
29天前
|
算法
基于模糊控制算法的倒立摆控制系统matlab仿真
本项目构建了一个基于模糊控制算法的倒立摆控制系统,利用MATLAB 2022a实现了从不稳定到稳定状态的转变,并输出了相应的动画和收敛过程。模糊控制器通过对小车位置与摆的角度误差及其变化量进行模糊化处理,依据预设的模糊规则库进行模糊推理并最终去模糊化为精确的控制量,成功地使倒立摆维持在直立位置。该方法无需精确数学模型,适用于处理系统的非线性和不确定性。
基于模糊控制算法的倒立摆控制系统matlab仿真