在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。
请找出那个只出现一次的数字。
你可以假设满足条件的数字一定存在。
思考题:
如果要求只使用 O(n)
的时间和额外 O(1)
的空间,该怎么做呢?
数据范围
数组长度 [1,1500]
。
数组内元素取值范围 [0,1000]
。
样例
输入:[1,1,1,2,2,2,3,4,4,4]
输出:3
答案:
int findNumberAppearingOnce(int* nums, int numsSize) {
struct number
{
int n;
int a;
}m[1001];
for (int i = 0; i < 1001; i++) {
m[i].n = 0;
m[i].a = 0;
}
for(int i=0;i<numsSize;i++)
{
m[nums[i]].n +=1;
m[nums[i]].a=nums[i];
}
for(int i=0;i<1001;i++)
{
if(m[i].n==1)
{
return m[i].a;
}
}
}
思考:以前做过一个类似的题目,两个字符串比较相同部分。当时用的办法就是先创造一个大数组并初始化,然后字符转换成ASCII码,作为数组里面元素索引值,第一个字符串出现一次就加,第二个字符串出现就减。然后遍历整个大数组,哪个为0,说明就是重复的。
此题类似。只不过是只有一个,所以我们选择的是1而不是0.同时为了输出特定数字,我们采取结构体的方法来解决,虽然思考少了,但是方便很多!
第一次写题解,谢谢大家!