python练习(十二)

注意,答案只是代表是他人写的代码,正确,但不一定能通过测试(比如超时),列举出来只是它们拥有着独到之处,虽然大部分确实比我的好

Move Zeroes

题目

Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.

For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].

Note:
You must do this in-place without making a copy of the array.
Minimize the total number of operations.

思路与解答

class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        l = len(nums)
        nums.remove(k)
        nums += [0]*(l-len(nums))

remove不是全删掉啊

class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        l = len(nums)
        while 0 in nums:
            nums.remove(0)
        nums += [0]*(l-len(nums))

225ms,15%,绝对不行啊

答案

class Solution(object):
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        nums.sort(key = lambda x:1 if x == 0 else 0

解释

# in-place
def moveZeroes(self, nums):
    zero = 0  # records the position of "0"
    for i in xrange(len(nums)):
        if nums[i] != 0:
            nums[i], nums[zero] = nums[zero], nums[i]
            zero += 1

Sum of Two Integers

题目

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

思路与解答

不允许使用加和减……
怎么做,位操作可以吗?不过不会啊

感谢LHearen,这个链接是关于位操作的一个总结
学习后的代码

        while b:
            a,b=a^b,(a&b)<<1      
        return a

然后测试时输入个负数,炸了
负数是什么鬼东西啊,负数是怎么在python中存储的啊

扩展阅读-取模(mod)与取余(rem)的区别

想搜负数在python中的存储方式,不太好搜,倒是搜到一些其它有意思的东西
负数除法相关-知乎-有些乱,详实
负数除法相关-博客-清晰,不全
取模运算-百度百科-写的不好,我都想把这个链接踢掉
取模(mod)与取余(rem)的区别-鬼知道作者是谁了

上边的扩展阅读和这道题毛线关系都没有,继续做题

这才是对这道题有帮助的文章

#不用额外的变量实现两个数字互换。
def swap(num_1, num_2):
    num_1 ^= num_2
    num_2 ^= num_1
    num_1 ^= num_2
    return num_1, num_2
'''
证明很简单,我们只需要明白异或运算满足下面规律:
0^a = a;
a^a = 0;
a^b^c = a^c^b;
'''

又跑题了?

class Solution(object):
    def getSum(self, a, b):
        """
        :type a: int
        :type b: int
        :rtype: int
        """
        mask = 0xFFFFFFFF
        while b:
            a,b=(a^b)&mask,((a&b)<<1)&mask      
        return a if a <= 0x7FFFFFFF else ~(a ^ mask)

不&mask就会出错

答案

那些用sum的我就不提了

class Solution(object):
    def getSum(self, a, b):
        """
        :type a: int
        :type b: int
        :rtype: int
        """
        # 32 bits integer max
        MAX = 0x7FFFFFFF
        # 32 bits interger min
        MIN = 0x80000000
        # mask to get last 32 bits
        mask = 0xFFFFFFFF
        while b != 0:
            # ^ get different bits and & gets double 1s, << moves carry
            a, b = (a ^ b) & mask, ((a & b) << 1) & mask
        # if a is negative, get a's 32 bits complement positive first
        # then get 32-bit positive's Python complement negative
        return a if a <= MAX else ~(a ^ mask)

Ugly Number

题目

Write a program to check whether a given number is an ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 6, 8 are ugly while 14 is not ugly since it includes another prime factor 7.

Note that 1 is typically treated as an ugly number.

思路与解答

class Solution(object):
    def isUgly(self, num):
        """
        :type num: int
        :rtype: bool
        """
        if not num:return False
        while num%2==0:
            num = num/2
        while num%3==0:
            num = num/3
        while num%5==0:
            num = num/5     
        return True if num ==1 else False

之前居然忽略0了,0不ugly哦

答案

for p in 2, 3, 5:
    while num % p == 0 < num:
        num /= p
return num == 1

return的很好。循环的也很好,去掉0的判断也很好

class Solution(object):
    def isUgly(self, num):
        """
        :type num: int
        :rtype: bool
        """
        #n = (2**30)*(3**20)*(5**13) = 4570198050078720000000000000L
        return False if num < 1 or (4570198050078720000000000000L)%num != 0 else True

巧妙的数学方法
这只是一个数学trick.ex:
如果k = 2 ^ n
则2 ^ 30%k == 0

Two Sum

题目

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:
Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

思路与解答

怎么感觉这题我做过

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        for k,v in enumerate(nums):
            if (target-v) in nums:
                return [k,nums.index(target-v)]

哦,不能重复使用

class Solution(object):
    def twoSum(self, nums, target):
        l=[]
        for k,v in enumerate(nums):
            if (target-v) in l:
                return [l.index(target-v),k]
            l.append(v)

虽然512ms,40%,但是,不可接受

答案

我看其它答案就是把列表换成了字典,于是我就改了一下

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        l={}
        for k,v in enumerate(nums):
            if (target-v) in l:
                return [l[target-v],k]
            l[v] = k

36ms,哇哦噢噢噢噢,爆炸
在字典里查值只需要O(1)

Single Number

题目

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

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

思路与解答

想起了异或,写写试试

        return reduce(operator.xor,nums)

so easy!

答案

def singleNumber1(self, nums):
    dic = {}
    for num in nums:
        dic[num] = dic.get(num, 0)+1
    for key, val in dic.items():
        if val == 1:
            return key

def singleNumber2(self, nums):
    res = 0
    for num in nums:
        res ^= num
    return res

def singleNumber3(self, nums):
    return 2*sum(set(nums))-sum(nums)

def singleNumber4(self, nums):
    return reduce(lambda x, y: x ^ y, nums)

def singleNumber(self, nums):
    return reduce(operator.xor, nums)

第3种很有想法
第一种好像可以优化下
抱歉,并不能
不对,如果这样的话

class Solution(object):
    def singleNumber(self, nums):
        dic = {}
        for num in nums:
            if num in dic:
                del dic[num]
            else:
                dic[num] = 1
        for key,v in dic.items():
            return key

确实快了一点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值