第十八周leetcode题

寻找唯一元素
本文介绍了一种高效的算法,用于从一个特殊数组中找到仅出现一次的两个元素。该算法利用了异或运算的特性,并通过排序和遍历数组来实现线性时间复杂度的解决方案。

Description:

Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

For example:

Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].

Note:

  1. The order of the result is not important. So in the above example, [5, 3] is also correct.
  2. Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?

题目会给定一个数列,数列中有且仅有两个元素只会出现一次,其他元素(如果有的话)只会出现两次。暴力搜的话不用想肯定超时,因此考虑别的方法。因为可以看成是大量出现两次的数字中找出出现一次的数字,用数字自己异或自己等于0的特点的话可以比较轻松地找出那两个只出现一次的数字。创建两个vector a,b。 a是过渡向量,b是结果向量,再初始化一个用于异或的int类型re。将题目给定的数列从小到大排序后,依次用里面的数字累积相与(re的取值为每次跟一个数相与以后的结果)。如果re不为零(即当前数与之前的结果相与不为零),检查过渡向量,如果向量不为空的话则将里面的元素复制至结果向量中,再将过渡向量中的元素删除,然后将当前数放入过渡队列,将re的值改为当前数的值。过渡向量为空的话直接将当前数放入过渡队列。re为零的话检查过渡队列,如果不为空的话则将其中的元素弹出。(因为之前已经排好序,所以如果是连续两个一样的数的话,第一个数放入过渡向量以后因为与第二个数相与结果为零,变回弹出。如果两个数不一样的话,则本来放在过渡向量中的第一个数便会移到结果向量中)。另外如果0这个数只出现一次的话就先将其放入结果向量中再进行上述步骤。代码如下:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        vector<int> a;
        vector<int> b;
        sort(nums.begin(),nums.end());
        
        int re=0;
        int temp;
        if(nums.size()==2)return nums;
        
        
        else 
        {   
            if(nums[0]==0&&nums[1]!=0)b.push_back(0);
            for(int i=0;i<nums.size();i++)
        {
            re^=nums[i];
           
            if(re!=0)
            {
                if(!a.empty())
                {                       
                    temp=a[0];
                    a.pop_back();                 
                    b.push_back(temp);
                    re=nums[i];
                }
                
               a.push_back(nums[i]);
                
            }
            
            else if(re==0)
            {
                if(!a.empty())a.pop_back();
            }
        }
        
        if(re!=0)b.push_back(nums[nums.size()-1]);
        }
        
        return b;
    }
};
### 前端开发面试目及答案汇总 #### 面试分类概述 为了帮助更好地准备前端开发岗位的面试,在接下来的内容中,将提供一系列覆盖HTML、CSS、JavaScript以及框架相关的重要知识点。这些问是基于实际招聘过程中常见的考察方向整理而成。 #### HTML基础问 1. 解释DOCTYPE的作用是什么?[^1] 2. 如何定义语义化标签及其重要性? 3. `<meta>` 标签有哪些常见属性? #### CSS布局与样式 4. Flexbox 和 Grid 的主要区别在哪里? 5. 使用媒体查询实现响应式设计的方法。 6. BFC (Block Formatting Context) 是如何工作的? #### JavaScript核心概念 7. 变量声明方式 var, let 和 const 之间的差异。 8. 函数作用域链的概念及其实现机制。 9. Promise 对象的工作流程和应用场景。 #### DOM操作技巧 10. 获取页面元素的方式有哪些? 11. 动态创建并插入新节点的具体方法。 12. Event Loop 工作原理简介。 #### 浏览器兼容性和性能优化 13. 处理不同浏览器间样式的不一致现象的最佳实践。 14. 图片懒加载的技术方案介绍。 15. Webpack 打包工具的基础配置要点。 #### Vue.js/React/Angular等主流框架特性 16. 单页应用(SPA)相对于传统多页网站的优势所在。 17. React 中 JSX 表达式的语法特点。 18. Vuex/Vuex Store 在Vue中的角色定位。 #### HTTP协议理解 19. GET 请求和 POST 请求的主要差别。 20. RESTful API 设计原则说明。 21. CORS 跨域资源共享策略解析。 #### TypeScript入门指南 22. 类型推断(Type Inference)的功能描述。 23. 接口(interface) vs 抽象类(abstract class)的选择依据。 24. 泛型(generics)的实际用途举例。 #### 安全意识培养 25. CSRF 攻击防范措施总结。 26. XSS 注入漏洞预防手段探讨。 27. HTTPS 加密传输的意义阐述。 --- 以上只是精选的一部分典型问列表,完整的100道库涵盖了更广泛的主和技术细节。针对每一个主领域都有深入浅出的回答模板可供参考学习。 ```javascript // 示例代码片段:简单的事件监听器设置 document.getElementById('myButton').addEventListener('click', function() { console.log('按钮被点击'); }); ``` #### 两复习计划建议 - **第1** - 每天集中精力掌握一组特定技能集内的基础知识,如第一天专注于HTML/CSS,第二天转向JS基础等等。 - 结合官方文档或优质教程加深印象,尝试动手编写简单案例来巩固所学内容。 - **第2** - 开始模拟真实场景下的编码挑战,利用LeetCode或其他平台练习算法目的解答能力。 - 查漏补缺阶段,回顾之前遇到困难的地方重新梳理思路直至完全理解为止。 - 将重点放在高频考点上反复训练直到能够流畅应对各类变体形式的问
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值