1.数组中有一个数只出现一次,其他数都出现3次,只用O(n)的复杂度,找出这个出现一次的数。
//在数组中的冗余问题
//有一个数只出现一次,其他数都出现3次
//找出这个数字,时间复杂度O(n)
//在数组中的冗余问题
//有一个数只出现一次,其他数都出现3次
//找出这个数字,时间复杂度O(n)
#include
int main()
{
int i,j,result = 0;
int array[] = {3,3,3,5,5,5,100,100,12,100,12,12,4};
int bit[32] = {0};
for(i = 0; i < sizeof(array) / sizeof(int); i++)
{
for(j = 0; j < 32; j++)
{
int k = 0x1 << j;//做标记
if(array[i] & k)//与运算
{
bit[j]++;
}
}
}
//除法取余,并转换成整型
for(j = 0;j < 32;j++)
{
bit[j] = bit[j] % 3;
if(bit[j] == 1)
{
result |= 0x1 <
2.LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。
我的解题思路:
找出0以外的最大最小点,保证每个点不重复,min和max的差距又不大于4,这样就足够了。用0去填充空格的事已经不需要关心了。没用。
class Solution {
public:
bool IsContinuous( vector numbers ) {
if(numbers.size() < 5)
return false;
vector::iterator it;
int min = 14;//超过最大
int max = 0;//超过最小
int array[14] = {0};//每个牌一个计数器
for(it = numbers.begin();it != numbers.end();it++)
{
array[*it]++;//计数器加1,*it刚好是指定位置
if(*it != 0)//0和普通数字分开,不然无法算差距
{
if(*it < min)
min = *it;
if(*it > max)
max = *it;
}
if(*it != 0 && array[*it] > 1)//只有0能重复
return false;
//最后可以检查一下非法输入,如果有必要
}
if(max - min > 4)
return false;
if(max - min < 4 - array[0])
return true;
cout <<"p"< vec;
vec.push_back(7);
vec.push_back(5);
vec.push_back(9);
vec.push_back(0);
vec.push_back(0);
cout << "result: " << s1.IsContinuous(vec) << endl;
printf("result:%d\n",s1.IsContinuous(vec));
cout << true << endl;
}
懒的贴了,扔git上。
https://github.com/huqinwei/algorithm/tree/master