leetcode 虐我篇之(十)Single Number II

    昨天一下子做了几道简单题,本来想再做多一点,被这道Single Number II 困住了,题目描述如下:

Given an array of integers, every element appears three times except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
    这道题跟single Number那道题有点像,于是我又想着是不是应该也是按位异或之类的,之前的异或,那我就同或,发现不对,然后又试了很多其它的组合,感觉像是在做数电题目,什么与门、或门、与非门、或非门等等,叫上室友wdc来一起想,结果还是没有想出来。难道这道题没有像前面那道题那样直接一个异或就能解决的方法。于是偷瞄了一下网上的解法,发现网上的解法都是那固定的两种。难道大家都是看答案的?!还是也想到同样的方法,牛!果然被虐惨了。

    解题思路大致上就说定义一个int长度大小的数组,存放对应原数组中每个数的每个位的1的个数,当是3的倍数时,变成0,那么剩下来的就是那个单独的数了。一开始又想着这种想法挺不错的喔。但是题目不是要求线性时间复杂度吗?两个for循环不就是n的平方啦。后面看一下某人的解释,O(32n)就是线性的,跟O(n)一样。对哦。唉,那么简单的东西都忘了,真的是,唉。。。但是另外一个地方,申请了个int大小的数组,跟题目中的那个“without using extra memory”会不会有矛盾呢?好像申请常量空间是可以的。

    我的代码如下:

int singleNumber2(int A[], int n)
{
	if (1 == n)
	{
		return A[0];
	}

	//建立一个sizeof(int)大小的数组,用于存放每个位1的个数
	const int int_size = sizeof(int)*8;
	int count[int_size] = {0};

	int bit = 1;		//用于移位的变量
	int single = 0;		//结果数
	
	for (int i = 0; i < int_size; i++)
	{		
		count[i] = 0;
		for(int j = 0; j < n; j++)
		{
			//判断数组元素的某一位是什么,并将其加到count数组中
			count[i] += (0 == (A[j] & bit))?0:1;

			//如果count元素等于3,那么将其置零
			if(3 == count[i])
			{
				count[i] = 0;
			}
		}

		//移位变量左移一位
		bit = bit<<1;
		//计数变量左移该变量对应的位后与结果数相或
		single |= count[i]<<i;
	}

	return single;

}
    代码里面的注释已经写得比较清晰了。就不多说了。只是有点不甘心,是看了解题的思路才写出程序来。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值