开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
一、题目描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
二、思路分析:
- 首先,用sort函数将数组进行排序。
- 然后用双重for循环找出只出现一次的数字。第一个for循环遍历数组的数字,第二个for循环让数组的前一个数与后一个数做比较。
- 从第一个数开始,如果第一个数与第二个数不相等则直接返回第一个数,否则i++,然后退出内部的循环,在外部循环中再次执行i++,即如果前一个数与后一个数相等,则数组中的数直接往后移两位(因为在内部循环中j=i+1,如果相邻两个数相等,则要移2位)
- 如果移到倒数第二位数(即将跳出for循环)还没有找到只出现一次的数,则最后一位即为所求的答案。
三、AC 代码:
class Solution
{
public:
int singleNumber(vector<int>& nums)
{
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]!=nums[j])
{return nums[i];}
else
{
i++;
break;
}
}
}
return nums[nums.size()-1];
}
};
参考
136. 只出现一次的数字,位运算,异或 - 只出现一次的数字 - 力扣(LeetCode)
136 数组中只出现一次的数(异或解题,不具普遍性) - 只出现一次的数字 - 力扣(LeetCode)
利用map来存储统计count信息,超过1的remove掉,最终只会保留一个 - 只出现一次的数字 - 力扣(LeetCode)