1.[2,2,1,7,6,9,0,4,4,0,9,6,1]
思路:
1.1 假设a[0]就是dingle number,
a[0]与a[1]之后的所有元素比较,直到最后一个元素。
1.2 如果中途a[0]等于其他元素,跳转出来,a[1]与后面的元素比,直到最后一个元素。
重复扫完所有元素。
瞬间方了,,,写的啥玩意儿
#include <iostream>
#include "stdio.h"
#include <vector>
using namespace std;
/*
思路整理:
假设每一个当前的都是双数,
并开始从第0个开始向后扫,确认假设,如果扫到最后,没找到相等的数,
说明猜想错误,退出,得出当前的下标,得出结果。
*/
class Solution {
public:
int singleNumber(int nums[]) {
int len=sizeof(nums);
int single_num;
for(int i=0;i<len;i++)
{
single_num=nums[i];
printf("\n judge if nums[%d]:---%d\n",i,nums[i]);
for(int j=0;j<len;j++)
{
if( single_num==nums[j] && j!=i )
{
printf("\nnot single_num,break!\n");
j=0;
break;
}
if(j==len-1)
{
//扫到最后了
printf("\n扫到最后了\n");
return nums[i];
}
printf(" %d",nums[j]);
}
}
}
};
int main()
{
Solution* So=new Solution;
//int arry[]={4,1,2,1,2};
int arry[]={2,1,2};
//int arry[]={4,1,2,1,2,4,7,6,6};
int re=So->singleNumber(arry);
printf("\n=======the result:=======%d\n",re);
return 0;
}
//简直太打击了!
输出的那串是什么回事?
能得出结果,但是复杂度为O(n2),,,不满足,,,,
原因:越界访问。
总算能正确跑过,,, 不容易,,,最简单的类型的题。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int len=nums.size();
int single_num,single_flag=0;
for(int i=0;i<len;i++)
{
single_num=nums[i];
//printf("\n judge if nums[%d]:---%d\n",i,nums[i]);
for(int j=0;j<len;j++)
{
if( single_num==nums[j] && j!=i )
{
//printf("\nnot single_num,break!\n");
j=0;
break;
}
if(j==len-1)
{
//扫到最后了
printf("\n扫到最后了\n");
single_flag=1;
// return nums[i];
}
}
if(single_flag)
//return nums[i];
break;
}
return single_num;
}
};
优化:
如何提速呢?
空间换时间呗,
保留菜痕迹,
class Solution {
/*
思路:创建一个新的vector来进行操作,只比第一个元素与后续的扫描。相等则删除。
*/
public:
int singleNumber(vector<int>& nums) {
//int len=nums.size();
int len;
vector<int> temp(nums);
int j=0,i=j+1;
while(1)
{
len=temp.size();//refresh the length of temp
//printf("len now:%d\n",len);
if(temp[j]==temp[i])
{
//printf("====%d\n",temp[0]);
temp.erase(temp.begin());//delete the 0th number,
temp.erase(temp.begin()+(i-1));//i should -1 for the 0th have been delete
i=j+1;
continue;
}
if(i==len)
return temp[j];//reach the end and not equal
i++;//else i<len
// if(i<len)
// {//not reach the end
// i++;
// //printf("i:%d\n",i);
// for(int v=0;v<len;v++)
// printf("%d ",temp[v]);
// }
// if(i==len)
// return temp[j];//reach the end and not equal
}
}
};
又越界访问!!!!
bug:越界访问导致ERROR: AddressSanitizer: heap-buffer-overflow on address
强迫症:
并没有优化了多少,,,没多少区别,
class Solution {
/*
思路:创建一个新的vector来进行操作,只比第一个元素与后续的扫描。相等则删除。
也可直接破坏传进来的nums,直接删它,直接对nums操作
*/
public:
int singleNumber(vector<int>& nums) {
vector<int> temp(nums);
int len,j=0,i=j+1;
while(1)
{
len=temp.size()-1;//refresh the length of temp
if(len==0)
return temp[j];
if(temp[j]==temp[i])
{
temp.erase(temp.begin());//delete the 0th number,
temp.erase(temp.begin()+(i-1));//i should -1 for the 0th have been delete
i=j+1;
continue;
}
if(i==len)
return temp[j];//reach the end and not equal
i++;//else i<len
}
}
};
看人家大神解法:666
The trick is: A^B^A=B
class Solution {
public:
int singleNumber(vector<int>& nums) {
if(nums.empty()) return 0;
int first = nums[0];
for(int i = 1; i<nums.size();i++) {
first = first ^ nums[i];
}
return first;
}
};