标签:leetcode
一、原题
Given an array of integers, every element appears twice except for one. Find that single one.
int singleNumber(int *nums, int numsSize)
二、举例来说
nums[numsSize] ::: nums[5] = {2, 1, 1, 1, 1}
题目要求返回的值就是其中只出现一次的数,也就是2
三、具体解决办法
题目要求在线性时间内解决问题。
方法一、
我首先想起的是算法导论的计数排序,把每个数值出现的次数统计一下,输出只出现一次的就可以了,但是结果runtime error,而后仔细观察,发现这个方法没法对nums[]中值是负的值计数,我放弃了这种方法,但觉得这种方法还是很值得学习的。
#include <stdio.h> #include <stdlib.h> //#define numSize 5 int singleNumber(int *nums, int numsSize){ int i; int MaxNum = nums[0]; int count[1000]; //find MaxNum of nums[] for(i = 1; i < numsSize; i++){ if(nums[i] > MaxNum){ MaxNum = nums[i]; } } //initialize count[i] for(i = 0; i <= MaxNum; i++){ count[i] = 0; } //count nums[i] for(i = 0; i < numsSize; i++){ count[nums[i]] = count[nums[i]] + 1; //printf("i: %d, nums[i]: %d, count[nums[i]]: %d\n", i, nums[i], count[nums[i]]); } /*for(i = 0; i <= MaxNum; i++){ printf("i: %d, apperas times: %d\n", i, count[i]); } printf("\n");*/ //find the num appear once for(i = 0; i <= MaxNum; i++){ if(count[i] == 1){ return nums[i]; } //else{ // return 0; //} } } int main(){ int nums[21] = {17,12,5,-6,12,4,17,-5,2,-3,2,4,5,16,-3,-4,15,15,-4,-5,-6}; int i; i = singleNumber(nums, 21); printf("difference num is: %d\n", i); system("pause"); return 0; }</span>哎,自己写代码能力还有待提高,太冗长了!
方法二、
参考别人博客写的,是通过异或实现的,有这样的规则:相同的数异或值为0,任何数与0异或都是该数本身,所以可以写代码了,这个是在leetcode上通过的。
#include <stdio.h> #include <stdlib.h> int singleNum(int *nums, int numsSize){ int i; int result = 0; for(i = 0; i < numsSize; i++){ result = result ^ nums[i]; } return result; } int main(){ int nums[21] = {17,12,5,-6,12,4,17,-5,2,-3,2,4,5,16,-3,-4,15,15,-4,-5,-6}; int result; result = singleNum(nums, 21); printf("%d\n", result); system("pause"); return 0; }</span>
看到accepted是不是很happy呢,不要因为是参考别人的想法,自己就懒得做,亲们,要加油!
标签:leetcode
原文地址:http://blog.csdn.net/zuoziji416/article/details/46419427