算法题练手

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











猜你喜欢

转载自blog.csdn.net/huqinweI987/article/details/50834409