剑指offer : 扑克顺子及二进制中1的个数 -- python3.6

版权声明:转载请声明转自Juanlyjack https://blog.csdn.net/m0_38088359/article/details/82960703

1、题目:
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的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。
注意:
(1)如果输入为空,返回False;
(2)不是王的牌如果出现两次,返回False;

分析:统计王的数量,然后对牌排序,接着如果后一个数比前一个数大于1(不包括1),则该大于1的数与1作差,若该差值大于王的数量则王无法补齐,返回False,否则可以补齐返回True.

class Solution:
    def IsContinuous(self, numbers):
        # write code here
        if not numbers:
            return False
        numbers.sort()
        zero = numbers.count(0)
        for i,v in enumerate(numbers[:-1]):
            '''
            注意此处只是取了数组里面前四个元素,和最后一个元素作差即可
            '''
            if v != 0:
                if v == numbers[i+1]:
                    return False
                zero = zero - (numbers[i+1]- v + 1) 
                '''
                加1是因为连续的数之间距离只能为1,所以有一个1可以作为缓冲
                '''
                if zero < 0:
                    return False
        return True

2、题目:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

此处引用别人的一个思路:
先判断n是不是负数,当n为负数的时候,因为计算机底层是用补码来保存数字的,所以负数最高位为1 ,因此先将最高位的符号位1变成0,此处用与运算即可,n & 0x7FFFFFFF,把负数转化成正数,同时count加1。整个整数 0x7FFFFFFF 的二进制表示就是除了首位是 0,其余都是1。就是说,这是最大的整型数 int(因为第一位是符号位,0 表示他是正数)。

把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0,如二进制数1100,从右边数起第三位是处于最右边的一个1,减去1后,得到结果1011,把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。1100&1011=1000。那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

class Solution:
    def NumberOf1(self,n):
        count = 0
        if n<0 :
            count += 1
            n = n & 0x7FFFFFFF
        while n > 0 :
            count += 1
            n = n & (n-1)
            print(n)
        return count

猜你喜欢

转载自blog.csdn.net/m0_38088359/article/details/82960703
今日推荐