最近一直学linux,而且一直没有注意总结,有种不踏实的感觉,那就刷刷题,写写博沉淀沉淀吧。
Leetcode是个面向面试的类似OJ的平台,据说它的题目很简洁而且切中的知识点都是经典的数据结构和算法,快要找实习了,就当复习复习DSA吧。
1.my solution
最先想到的就是hash table,只要table足够大,就能使得数组中每个数对应一个坑,起始坑里数字为0,该坑对应的数出现一次变为1,再出现一次又变为0,然后遍历找出坑里数为1对应的数即可。
下面是代码,用了bitset,感觉节约了空间,,要注意处理负数。感觉数据量不大,40000就可以ac了。
<strong><span style="font-family:Microsoft YaHei;">class Solution {
public:
int singleNumber(vector<int>& nums) {
bitset<40000>b;
int n=nums.size();
for(int i=0;i!=n;++i)
{
int k=nums[i]%20000;
b.flip( 19999+k );
}
for(int i=0;i!=40000;++i)
{
if(b.test(i))
{
return i-19999;}
}
}
};</span></strong>Runtime: 28 ms。
2.better solution
在discuss中看到了更好的方法,相比之下自己的方法就逊多了。
主要的思想是利用异或,对于每个int整数来说底层都有唯一的表示,两个数a,b进行a xor b 得到0 ,如果只出现一次, a xor 0 还是为a。通过这个方法可以快速找到唯一.
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res=0;
for(int i=0;i!=nums.size();++i)
res ^= nums[i];
return res;
}
};Runtime: 20
ms.
本文分享了作者在学习Linux过程中的体会,并通过LeetCode平台进行了实战练习,从hashtable算法到更高效的异或算法解决单一元素问题。文章深入探讨了解题思路和代码实现,旨在提升数据结构与算法(DSA)的理解。

被折叠的 条评论
为什么被折叠?



