python(剑指offer33-36题)

33.把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数.根据丑数的定义实现代码

class Solution:
    def GetUglyNumber_Solution(self, index):
        # write code here
        # 从一到六全是丑数,当index<7时,减少了运算,大于7后没有什么用
        if index < 7:
            return index
        t2, t3, t5 = 0, 0, 0
        ans = [1]
        # 每一个丑数一定是2|3|5 一个或多个的乘积
        for i in range(1, index):
            # 每次添加一个最小的
            ans.append(min(ans[t2]*2, ans[t3]*3, ans[t5]*5))
            # 每次都用当前位与之前为*2|3|5比较。
            if ans[i] == ans[t2]*2:
                t2 += 1
            if ans[i] == ans[t3] * 3:
                t3 += 1
            if ans[i] == ans[t5] * 5:
                t5 += 1
        # 数组下标从0开始,所以需要减1 
        return ans[index - 1]

34.在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 熟悉python的方法

class Solution:
    def FirstNotRepeatingChar(self, s):
        # write code here
        for i,ch in enumerate(s):
            if s.count(ch) == 1:
                return i
        return -1

35.在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007

class Solution:
    def InversePairs(self, data):
        # write code here
        return self.inverseCount(data[:], 0, len(data)-1, data[:]) % 1000000007
    def inverseCount(self, tmp, start, end, data):
        if end - start < 1:
            return 0
        if end - start == 1:
            if data[start] <= data[end]:
                return 0
            else:
                tmp[start], tmp[end] = data[end], data[start]
                return 1
        mid = (start + end) // 2
        cnt = self.inverseCount(data, start, mid, tmp) +  
                            self.inverseCount(data, mid+1 , end, tmp)
        i = start
        j = mid + 1
        ind = start
        while(i <= mid and j <= end):
            if data[i] <= data[j]:
                tmp[ind] = data[i]
                i += 1
            else:
                tmp[ind] = data[j]
                cnt += mid -i + 1
                j += 1
            ind += 1
        while(i <= mid):
            tmp[ind] = data[i]
            i += 1
            ind += 1
        while(j <= end):
            tmp[ind] = data[j]
            j += 1
            ind += 1
        return cnt

36.输入两个链表,找出它们的第一个公共结点。

class Solution:
    def FindFirstCommonNode(self, pHead1, pHead2):
        # write code here
        p1 = pHead1
        p2 = pHead2
        //当p1,p2不相等时
        while(p1!=p2):
            //若是长度不相等时,使其指向同一个链表,否则指向下一个
            p1 = (pHead2 if p1 is None else p1.next)
            p2 = (pHead1 if p2 is None else p2.next)
        return p1

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值