LintCode刷起来(一)

1. A + B 问题

  • 方法一:
class Solution:"""@param a: An integer@param b: An integer@return: The sum of a and b """def aplusb(self, a, b):# write your code herereturn a + b
  • 方法二:
class Solution:"""@param a: An integer@param b: An integer@return: The sum of a and b """def aplusb(self, a, b):# write your code herereturn sum([a, b])
  • 方法三:
from operator import addclass Solution:"""@param a: An integer@param b: An integer@return: The sum of a and b """def aplusb(self, a, b):# write your code herereturn add(a, b)

2 · 尾部的零

大佬救命,大佬饶命
大佬还是大佬,太强了。想要知道有多少个0也就是里面有这n个数可以拆分出来多少个2和5。很显然5的个数远远小于2的个数,所以这n个数可以拆分出来多少个5也就是多少个0.
不得不说大佬思路太强了。下面也就是找1234···n-1n里面可以拆分出多少个5了很显然5的倍数必定可以拆分出至少一个5,同时25的倍数可以拆分出至少两个5,依次类推,5^i次方至少可以拆分出来i个5,我们可以第一次只统计5的倍数,然后5 ^ 2的倍数依次类推到5 ^ i的倍数,所有个数加起来即可。

class Solution:"""@param n: A long integer@return: An integer, denote the number of trailing zeros in n!"""def trailingZeros(self, n):# write your code herenum = 0i = 5while n>=i:num += n//ii = i * 5return num

3 · 统计数字

  • 方法一:偷个懒直接用python的内置函数 cout来做,可以用来查找一个字符串中指定字符的个数
class Solution:"""@param k: An integer@param n: An integer@return: An integer denote the count of digit k in 1..n"""def digitCounts(self, k, n):# write your code hereresult = 0for item in range(0, n+1):number = str(item).count(str(k))result += numberreturn result
  • 方法二:
    笨笨的方法对每个数都进行统计,能力所限,懒得优化了,据大佬说可以优化到O(logN)
class Solution:"""@param k: An integer@param n: An integer@return: An integer denote the count of digit k in 1..n"""def digitCounts(self, k, n):# write your code hereresult = 0if k == 0 :result += 1for i in range(n+1):temp = iwhile temp:if temp % 10 == k:result +=1temp//=10return result
  • 方法三:大佬的方法,感兴趣的看看就好
class Solution:"""@param: : An integer@param: : An integer@return: An integer denote the count of digit k in 1..n"""def digitCounts(self, k, n):def ten(power):return 10**powerdigits = self.getNumOfDigits(n)ans = 0if k == 0:for i in range(digits-1):ans += (n // ten(i+1) -1) * ten(i)ans += min(n % ten(i+1), ten(i) - 1) + 1ans += 1else:for i in range(digits):ans += n // ten(i+1) * ten(i)ans += max(0, min( (k+1)*ten(i)-1, n%ten(i+1) ) - k*ten(i) + 1)return ans@staticmethoddef getNumOfDigits(n):if n == 0:return 1count = 0while n:count += 1n //= 10return count

4 · 丑数 II

其实思路很明确也很简单,枚举肯定最麻烦而且也不可取。由于整数均可以划分为素数不同幂次的乘积且只有一种情况。只有质因子2、3、5所以它必定是这三个数的不同幂次的乘积,所以我们只需要有效到大依次找到并且第N个就好了。

class Solution:"""@param n: An integer@return: the nth prime number as description."""def nthUglyNumber(self, n):# write your code hereheap = [1]p2,p3,p5 = 0,0,0for i in range(n - 1):last = heap[-1]while heap[p2] * 2 <= last:p2 += 1while heap[p3] * 3 <= last:p3 += 1while heap[p5] * 5 <= last:p5 += 1heap.append(min(heap[p2] * 2, heap[p3] * 3, heap[p5] * 5))return heap[-1]

我看网上还有一种堆排序的算法也是可以的
seen采用元组的因为查找方便,运用了空间换时间的方法
求第n小的丑数,可以采用最小堆来解决。每次弹出堆中最小的丑数,然后检查它分别乘以2、3和 5后的数是否生成过,如果是第一次生成,那么就放入堆中。第n个弹出的数即为第n小的丑数。
至于为什么要判断是否生成过,因为如果最小为2的时候4,6,10会放入,但是当最小为3时6,9,10也会放入,同理5最小时10,15,25也会放入。这样可以将重复的6和10排除,方便堆排序

import heapqclass Solution:"""@param n: An integer@return: return a  integer as description."""def nthUglyNumber(self, n):heap = []heapq.heappush(heap, 1)seen = set()seen.add(1)factors = [2, 3, 5]curr_ugly = 1for _ in range(n):# 每次弹出当前最小丑数curr_ugly = heapq.heappop(heap)# 生成新的丑数for f in factors:new_ugly = curr_ugly * fif new_ugly not in seen:seen.add(new_ugly)heapq.heappush(heap, new_ugly)return curr_ugly

LintCode刷起来(一)相关推荐

  1. 二、lintcode刷题记录--二叉树的路径和

    LintCode刷题记录---二叉树的路径和(效率可能没有那些专业的高,主要是代码结构比较简单) ) 题目地址:http://www.lintcode.com/zh-cn/problem/binary ...

  2. LintCode刷题:有效数字

    今天第一次是跟随一个博主学习足迹知道有LintCode 和LeetCode这两个刷题网址,专为学编程的同志练手,我希望我可以每天坚持刷一题!!!! 第一次不知道直接点"帮我挑一题" ...

  3. LintCode刷题(入门篇)

    最近在玩LintCode上面的算法题.下面分享一下部分题目的答案.如果其他同学有更好的答案,可以和我交流讨论,本人菜鸟一个,各位大佬多指点. 同时说一下,这个上面的二叉树 和 链表 我不懂,所以这类题 ...

  4. LintCode刷题——Largest Divisible Subset

    题目内容: Given a set of distinct positive integers, find the largest subset such that every pair (Si, S ...

  5. LintCode刷题——不同的二叉查找树I、II

    不同的二叉查找树I: 题目内容: 给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种? 样例: 给出n = 3,有5种不同形态的二叉查找树: 1 3 3 2 1\ / / / \ \3 ...

  6. LintCode刷题笔记-- BackpackIII

    标签:动态规划 问题描述: Given n items with size Ai and value Vi, and a backpack with size m. What's the maximu ...

  7. lintcode刷题 14. 二分查找,迭代和二分法Python实现

    14. 二分查找 描述 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. ...

  8. LintCode刷题——打劫房屋I、II、III

    打劫房屋I: 题目内容: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该 ...

  9. c++ LintCode刷题记录之52. 下一个排列

    描述 给定一个整数数组来表示排列,找出其之后的一个排列 解释:只需要找到下一个排列,比如(3,2,1)没有下一个排列就是(1,2,3).也说明如果序列按递减排列就没有下一个.所以要换位置的第一个数一定 ...

最新文章

  1. 介绍三种绘制时间线图的方法
  2. Softmax和Cross-entropy是什么关系?
  3. element-- 修改MessageBox 弹框 中确定和取消按钮顺序
  4. 大学最后一个学期了,感觉没对头。。。
  5. 微信小程序 wx:key 提示-解决
  6. Mac连接路由器后没有反应_无线WiFi无法连接到网络怎么办【解决方法】
  7. DPDK helloworld 源码阅读
  8. PC客户端(CS架构)如何实现抓包
  9. flash air java_flashair安卓版
  10. 大漠插件注册使用方法教程
  11. 激活工具带毒感染量近60万,而北京等四城市用户不被攻击
  12. 在mac上开启httpServer服务
  13. call function中的 exporting/importing/changing
  14. DepthMap(1):D. Eigen (NIPS2014)
  15. 我们为什么要进行时间管理?
  16. 核磁谱图分析步骤_核磁共振解析图谱的步骤
  17. 9.foreign key(外键)
  18. 算法速成记录贴Day3
  19. 3DSMAX中英文对照大全(从A-Z分类)
  20. Linux C/C++ 获取系统时间

热门文章

  1. tomcat部署web應用時涉及到的基本概念
  2. 操作系统实验报告15:进程同步与互斥线程池
  3. iOS逆向之深入解析如何计算+load方法的耗时
  4. RxSwift之深入解析map操作符的底层实现
  5. Swift之深入解析“指针”的使用和实现
  6. 考虑页面置换算法,系统有m个物理块供调度,初始时全空,页面引用串长度为p,包含了n个不同的页号,无论用什么算法,缺页次数不会少于( )
  7. 2019第十届蓝桥杯C/C++ A组省赛 —— 第三题: 最大降雨量
  8. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1103:陶陶摘苹果
  9. 【C语言】C语言实现面向对象编程之多态
  10. 【Linux】一步一步学Linux——nisdomainname命令(171)