个人博客:枫之羽

目录

前言

入门题

37. 反转一个3位整数

145. 大小写转换

452. 删除链表中的元素

454. 矩阵面积

463. 整数排序

466. 链表节点计数

479. 数组第二大数

484. 交换数组两个元素

763. 进制转换

632. 二叉树的最大节点

简单题

1. A + B 问题

2. 尾部的零

6. 合并排序数组 II

8. 旋转字符串

9. Fizz Buzz 问题

13. 字符串查找

14. 二分查找

22. 平面列表


前言

这里是使用Python刷题,后面也会刷LeetCode(Python),熟悉运用【有兴趣的可以一起】。 会持续更新,有问题或者更好的方法可以提出交流,谢谢。

入门题

37. 反转一个3位整数

反转一个只有3位数的整数。

样例

123 反转之后是 321
900 反转之后是 9

注意事项

你可以假设输入一定是一个只有三位数的整数,这个整数大于等于100,小于1000。

注意:Python3中整除要用 //

class Solution:"""@param number: A 3-digit number.@return: Reversed number."""def reverseInteger(self, number):# write your code herereturn number % 10 * 100 + number // 10 % 10 * 10 + number // 100 % 10if __name__ == '__main__':sol = Solution()ans = sol.reverseInteger(123)print(ans)

简化:利用str的切片操作

class Solution:"""@param number: A 3-digit number.@return: Reversed number."""def reverseInteger(self, number):# write your code hereif number < 0:return int(str(number*-1)[::-1])*-1return int(str(number)[::-1])

145. 大小写转换

将一个字符由小写字母转换为大写字母

样例

a -> A

b -> B

class Solution:"""@param character: a character@return: a character"""''' s.upper(), s.lower(), s.capitalize():首字母大写,其余小写, s.title():所有单词首字母大写,其余小写 '''def lowercaseToUppercase(self, character):# write your code herereturn character.upper()

452. 删除链表中的元素

删除链表中等于给定值val的所有节点。

样例

给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5

思路:链表的建立与遍历,节点的删除操作。 题目中隐含着 可能所有节点都等于val这一情况,所以要新增一个头结点


"""
Definition of ListNode
class ListNode(object):def __init__(self, val, next=None):self.val = valself.next = next
"""class Solution:"""@param head: a ListNode@param val: An integer@return: a ListNode"""def removeElements(self, head, val):# write your code hereif head is None:return None# 可能链表中的元素值都为val,所以新增一个头结点 new = ListNode(0)new.next = head     # 将原链表接在新链表后面pre = new           # pre保存的是有效节点的前一个节点while pre.next is not None: # 遍历链表if pre.next.val == val: # 值相同pre.next = pre.next.next    # 删除该节点else:                   # 值不同pre = pre.next              # 后移return new.next                     # 去掉头结点

454. 矩阵面积

实现一个矩阵类Rectangle,包含如下的一些成员变量与函数:

  1. 两个共有的成员变量 width 和 height 分别代表宽度和高度。

  2. 一个构造函数,接受2个参数 width 和 height 来设定矩阵的宽度和高度。

  3. 一个成员函数 getArea,返回这个矩阵的面积。

样例

Java:Rectangle rec = new Rectangle(3, 4);rec.getArea(); // should get 12Python:rec = Rectangle(3, 4)rec.getArea()
class Rectangle:'''* Define a constructor which expects two parameters width and height here.'''# write your code heredef __init__(self, width, height):self.width = widthself.height = height'''* Define a public method `getArea` which can calculate the area of the* rectangle and return.'''# write your code heredef getArea(self):return self.height * self.widthif __name__ == '__main__':rec = Rectangle(3, 4)ans = rec.getArea()print(ans)

463. 整数排序

给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法。

样例

对于数组 [3, 2, 1, 4, 5], 排序后为:[1, 2, 3, 4, 5]

class Solution:"""@param A: an integer array@return: nothing"""def sortIntegers(self, A):# write your code here# 101ms# A.sort() # 快速排序# 302ms# for i in range(len(A)):#     for j in range(i):#         if (A[i] < A[j]):#             A[i], A[j] = A[j], A[i]# 402ms 冒泡排序# for i in range(len(A) - 1):#     for j in range(len(A) - i - 1):#         if (A[j] > A[j + 1]):#             A[j], A[j + 1] = A[j + 1], A[j]# 251ms 选择排序# for i in range(len(A)):#     key = i#     for j in range(i, len(A)):#         if (A[j] < A[key]):#             key = j#     A[i], A[key] = A[key], A[i]# 201ms 插入排序for i in range(1, len(A)):tmp = A[i]for j in range(i, -1, -1):# j为当前位置,试探j-1位置if A[j-1] > tmp:A[j] = A[j-1]else:breakA[j] = tmpif __name__ == '__main__':A = [3, 2, 1, 4, 5]Solution().sortIntegers(A)print(A)

466. 链表节点计数

计算链表中有多少个节点.

样例

给出 1->3->5, 返回 3.

"""
Definition of ListNode
class ListNode(object):def __init__(self, val, next=None):self.val = valself.next = next
"""class Solution:"""@param head: the first node of linked list.@return: An integer"""def countNodes(self, head):# write your code herecnt = 0while head is not None:cnt += 1head = head.nextreturn cnt

479. 数组第二大数

在数组中找到第二大的数

样例

给出 [1, 3, 2, 4], 返回 3.

给出 [1, 2], 返回 1.

注意事项

你可以假定至少有两个数字

class Solution:"""@param nums: An integer array@return: The second max number in the array."""def secondMax(self, nums):# write your code herenums.sort()return nums[len(nums)-2]

484. 交换数组两个元素

给你一个数组和两个索引,交换下标为这两个索引的数字

样例

给出 [1,2,3,4] index1 = 2, index2 = 3. 交换之后变成 [1,2,4,3]

class Solution:"""@param A: An integer array@param index1: the first index@param index2: the second index@return: nothing"""def swapIntegers(self, A, index1, index2):# write your code hereA[index1], A[index2] = A[index2], A[index1]

763. 进制转换

给定一个十进制数 n 和 一个整数 k, 将 十进制数 n 转换成 k进制数.

样例

样例 1:
给定 n = 5k = 2
return "101"

样例 2:
给定 n = 30k = 16
return "1E"

注意事项

1.0<=n<=2^31-12<=k<=16
2.每个大于 9 的字符都用大写字母表示

注意:n==0情形

# -*- coding: utf-8 -*-
# @Time    : 18-9-12 下午11:12
# @Author  : yufeng
# @Blog    :https://blog.csdn.net/feng_zhiyuclass Solution:"""@param n: a decimal number@param k: a Integer represent base-k@return: a base-k number"""# 151msdef hexConversion(self, n, k):# write your code herejin = ['A', 'B', 'C', 'D', 'E', 'F']ans = []if n == 0:ans.append('0')while n != 0:c = n % kn //= kif c > 9:ans.append(jin[c-10])else:ans.append(str(c))s = "".join(ans)return s[::-1]if __name__ == '__main__':ans = Solution().hexConversion(30, 16)print(ans)

632. 二叉树的最大节点

在二叉树中寻找值最大的节点并返回。

样例

给出如下一棵二叉树:

     1/   \-5     2/ \   /  \
0   3 -4  -5

返回值为 3 的节点。

"""
Definition of TreeNode:
class TreeNode:def __init__(self, val):self.val = valself.left, self.right = None, None
"""class Solution:"""@param: root: the root of tree@return: the max node"""node = NonemaxNum = -99999def maxNode(self, root):# write your code hereif root is None:return Noneself.max(root)return self.nodedef max(self, root):if root is None:return Noneif root.val > self.maxNum:self.maxNum = root.valself.node = rootself.max(root.left)self.max(root.right)

简单题

1. A + B 问题

给出两个整数 aa 和 bb , 求他们的和。

样例

如果 a=1 并且 b=2,返回3

挑战

显然你可以直接 return a + b,但是你是否可以挑战一下不这样做?(不使用++等算数运算符)

说明

a和b都是 32位 整数么?

  • 是的

我可以使用位运算符么?

  • 当然可以

注意事项

你不需要从输入流读入数据,只需要根据aplusb的两个参数a和b,计算他们的和并返回就行。

思路:

# x^y                执行加法
# (x&y)<<1           进位操作

Python3中long 类型存放数据无限长,当正整数+负整数时,不会出现溢出。 

因此会超时。 详解见:不用加减乘除做加法中Python存在的bug

67%正确:

class Solution:"""@param a: An integer@param b: An integer@return: The sum of a and b"""# x^y                执行加法# (x&y)<<1           进位操作def aplusb(self, a, b):# if (a&b) == 0:#     return a|b# return self.aplusb((a & b) << 1, a ^ b)sum = a ^ bcarry = (a & b) << 1while (carry):a = sumb = carrysum = a ^ bcarry = (a & b) << 1# print(sum, end="")return sum

2. 尾部的零

设计一个算法,计算出n阶乘中尾部零的个数

样例

11! = 39916800,因此应该返回 2

挑战

O(logN)的时间复杂度

思路:10=2*5;求n!十进制数尾部0的个数看因子2和因子5的倍数的个数,但是5的倍数的个数一定小于2的倍数的个数。

类似地,求三进制就是n//=3,二进制n//=2

class Solution:"""@param: n: An integer@return: An integer, denote the number of trailing zeros in n!"""def trailingZeros(self, n):# write your code here, try to do it without arithmetic operators.res = 0while(n):n //= 5res += nreturn res

6. 合并排序数组 II

合并两个排序的整数数组A和B变成一个新的数组。

样例

给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]

挑战

你能否优化你的算法,如果其中一个数组很大而另一个数组很小?

class Solution:"""@param A: sorted integer array A@param B: sorted integer array B@return: A new sorted integer array"""def mergeSortedArray(self, A, B):# write your code here# 101ms# if A is None:#     return B# if B is None:#     return A# i = 0# if (len(A) > len(B)):#     big, small = A, B# else:#     big, small = B, A# while (len(small)):#     tmp = small[0]#     j = len(big)#     if (i == j):#         big.append(tmp)#         small.remove(tmp)#     elif tmp <= big[i]:#         big.insert(i, tmp)#         small.remove(tmp)#     else:#         i += 1# return big# 151msC=A+BC.sort(reverse = False)return C

8. 旋转字符串

给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)

样例

对于字符串 "abcdefg".

offset=0 => "abcdefg"
offset=1 => "gabcdef"
offset=2 => "fgabcde"
offset=3 => "efgabcd"

挑战

在数组上原地旋转,使用O(1)的额外空间

分析:这里str是array类型, 你可以通过help(array)查看到内置函数insert(), pop() 和list用法类似。

python中 array模块学习笔记

class Solution:"""@param str: An array of char@param offset: An integer@return: nothing"""def rotateString(self, str, offset):# write your code hereif not str or not offset:returnfor i in range(offset % len(str)):str.insert(0, str.pop())if __name__ == '__main__':s = 'a,b,c,d,e,f,g'str = s.split(',')Solution().rotateString(str, 3)print(str)

9. Fizz Buzz 问题

给你一个整数n. 从 1 到 n 按照下面的规则打印每个数:

  • 如果这个数被3整除,打印fizz.
  • 如果这个数被5整除,打印buzz.
  • 如果这个数能同时被35整除,打印fizz buzz.

样例

比如 n = 15, 返回一个字符串数组:

["1", "2", "fizz","4", "buzz", "fizz","7", "8", "fizz","buzz", "11", "fizz","13", "14", "fizz buzz"
]

挑战

Can you do it with only one if statement?

输入测试数据 (每行一个参数)

class Solution:"""@param n: An integer@return: A list of strings."""def fizzBuzz(self, n):# write your code hereres = []for i in range(1, n + 1):if i % 15 == 0:res.append("fizz buzz")elif i % 3 == 0:res.append("fizz")elif i % 5 == 0:res.append("buzz")else:res.append(str(i))return res

13. 字符串查找

对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1

样例

如果 source = "source" 和 target = "target",返回 -1

如果 source = "abcdabcdefg" 和 target = "bcd",返回 1

挑战

O(n2)的算法是可以接受的。如果你能用O(n)的算法做出来那更加好。(提示:KMP)

说明

在面试中我是否需要实现KMP算法?

  • 不需要,当这种问题出现在面试中时,面试官很可能只是想要测试一下你的基础应用能力。当然你需要先跟面试官确认清楚要怎么实现这个题。
class Solution:"""@param source:@param target:@return: return the index"""def strStr(self, source, target):if source is None or target is None:return -1len_s = len(source)len_t = len(target)for i in range(len_s - len_t + 1):j = 0while (j < len_t):if source[i + j] != target[j]:breakj += 1if j == len_t:return ireturn -1

字符串匹配的kmp算法 及 python实现

14. 二分查找

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

样例

在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2

挑战

如果数组中的整数个数超过了2^32,你的算法是否会出错?

class Solution:"""@param nums: The integer array.@param target: Target to find.@return: The first position of target. Position starts from 0."""# 101msdef binarySearch(self, nums, target):# write your code herel, r=0, len(nums) - 1while l <= r:mid = (l + r) >> 1if nums[mid] < target:l = mid + 1elif nums[mid] > target:r = mid - 1else:while nums[mid] == target:mid -= 1return mid+1return -1

22. 平面列表

给定一个列表,该列表中的每个要素要么是个列表,要么是整数。将其变成一个只包含整数的简单列表。

样例

给定 [1,2,[1,2]],返回 [1,2,1,2]

给定 [4,[3,[2,[1]]]],返回 [4,3,2,1]

挑战

请用非递归方法尝试解答这道题。

注意事项

如果给定的列表中的要素本身也是一个列表,那么它也可以包含列表。

分析:python的type和isinstance的区别 非递归可以用栈实现

  • isinstance(object,type)判断一个对象是否是已知类型type,其中type()作用类似,有区别,详见上面链接
  • list.extend(seq) 用新列表扩展原来的列表

递归:

class Solution(object):# @param nestedList a list, each element in the list# can be a list or integer, for example [1,2,[1,2]]# @return {int[]} a list of integerdef flatten(self, nestedList):# Write your code hereif isinstance(nestedList,int):# isinstance(object,type)return [nestedList]res = []for i in nestedList:res.extend(self.flatten(i))# list.extend(seq) 用新列表扩展原来的列表return res

非递归(这种效率最高):

class Solution(object):# @param nestedList a list, each element in the list# can be a list or integer, for example [1,2,[1,2]]# @return {int[]} a list of integerdef flatten(self, nestedList):# Write your code herestack = [nestedList]res = []while stack:top = stack.pop()if isinstance(top, list):for elem in reversed(top):  # 栈的特点需要反转stack.append(elem)else:res.append(top)return res

另一种来自讨论区(效率其次):

class Solution(object):# @param nestedList a list, each element in the list# can be a list or integer, for example [1,2,[1,2]]# @return {int[]} a list of integerdef flatten(self, nestedList):# Write your code hereif isinstance(nestedList, int):return [nestedList]ret = []while len(nestedList) > 0:current = nestedList.pop(0)if isinstance(current, int):ret.append(current)else:nestedList = current + nestedListreturn ret

LintCode题解【Python版】相关推荐

  1. python解acm题_2020年常熟理工学院第一届线上ACM选拔赛题解(Python版)

    这个题目是4140: Trojke的一个扩展,在这个题目里由于可以匹配的棋子很多,我们应该想的是去遍历这个棋盘的所有线.这就是格点问题:从(0,0)到(x,y)的线段,经过的格点数目是gcd(x,y) ...

  2. 洛谷 刷题 深基部分题解(python版)-2022.01.29

    P5703 [深基2.例5]苹果采购(python3实现) https://blog.csdn.net/dllglvzhenfeng/article/details/122690555 P5703 [ ...

  3. 【Leetcode】刷题之路3(python版)

    回溯专题 1.回溯算法的本质是n叉树的深度优先搜索,同时,需要注意剪枝减少复杂度. 2.回溯算法三部曲 确定参数和返回值 回溯函数终止条件 单层循环 3.回溯法思路 回溯法是一种算法思想,而递归是一种 ...

  4. LeetCode/LintCode 题解丨一周爆刷字符串:空格替换

    描述 设计一种方法,将一个字符串中的所有空格替换成 %20 . 字符串以字符数组的形式给出,你可以假设该字符串有足够的空间来加入新的字符,且你得到的是"真实的"字符长度. 你的程序 ...

  5. 算法设计与分析(python版)-作业三

    参考教材:算法设计与分析(Python版)         作者:王秋芬 1 . 普通 (5分)以下问题中,哪些问题的分治算法消耗的时间与输入序列无关.() A. 二分查找 B. 合并排序 C. 快速 ...

  6. 遗传算法(python版)

    遗传算法(python版) 1.基本概念 遗传算法(GA)是最早由美国Holland教授提出的一种基于自然界的"适者生存,优胜劣汰"基本法则的智能搜索算法.该法则很好地诠释了生物进 ...

  7. 统计学习圣经!经典教材《统计学习导论》Python版

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 编辑:张倩,来源:机器之心 <统计学习导论>很经典,但习题用 ...

  8. python数据结构与算法分析_数据结构与算法(Python版)

    为什么研究数据结构与算法 本周带大家进入Python版数据结构与算法的学习.想必大家都听过"算法"一词,算法的学习对编程者来说是至关重要的.首先我们先了解一下为什么要研究数据结构与 ...

  9. 经典教材《统计学习导论》现在有了Python版

    来源:机器之心 本文约1000字,建议阅读5分钟 <统计学习导论>很经典,但用的是 R 语言,没关系,这里有份 Python 版习题实现. 斯坦福经典教材<The Element o ...

  10. 赞!经典教材《统计学习导论》终于有Python版了

    <统计学习导论>是数据科学家中最受欢迎的书籍之一,旨在介绍机器学习算法背后的概念,但这本书的习题都是用R语言实现的,这对于主要使用 Python 语言的机器学习研究者来说不太友好. 为了解 ...

最新文章

  1. 5G+AI成产业新引擎 安防行业切入点在哪里?
  2. boost::allocate_shared_noinit相关的测试程序
  3. Gym - 102001K Boomerangs 构造 + 三元环
  4. Docker实战(精简版本)
  5. 《Windows高级调试》译者线上聊天活动获奖网友名单
  6. 解决问题,别扩展问题
  7. mstsc 中文打不了_伟大的中文!(妙不可言)
  8. 五分钟搞定单片机keil5 运行破解安装教程
  9. 计算机连上wifi无法上网了,电脑已连接wifi但无法上网 已连接wifi但电脑无法上网-192路由网...
  10. 快速搞懂Oracle 19c安全新特性 (二) Privilege Analysis(权限分析)
  11. Unity3d——UGUI学习笔记
  12. 腾讯云Web应用防火墙有什么用?Web应用防火墙是防御原理介绍
  13. R5 7640H参数 锐龙R57640H性能怎么样相当于什么水平级别
  14. pandas 入门(pandas 数据结构介绍)
  15. 初学Python之math模块在哪里?
  16. 清华计算机系超算团队,清华学生超算团队获得国际大学生超级计算机竞赛总冠军...
  17. 【leetcode】搜索二维矩阵 II
  18. markdown 摘记
  19. 山东电网计算机专业录取率,国家电网太难进?网友:这个二本高校进山东电网的人数仅次于山大...
  20. Arduino Uno + 光耦继电器 弱电控制强电 实验

热门文章

  1. 7-3 出租车计价 (15分)
  2. python 比较两个字典的结构差异
  3. 鸿蒙os开源连接,全场景无缝连接 鸿蒙OS开源邀请全球开发者共助生态发展
  4. 服务器多系统ssd寿命检测,多品牌服务器上SSD磁盘寿命的批量统计与监控方法
  5. 2022爱分析・采购数字化厂商全景报告 | 爱分析报告
  6. docker安装及yapi的安装
  7. 海店湾:不尊重质量,就如同自掘坟墓,无印良品,真的要凉凉了!
  8. 微信群如何实现只接收红包消息提醒
  9. 粒子群算法实战分享-附原版动画PPT(技术分享也可以文艺范?)
  10. 解决WebView内存泄漏【最干货】