第一题

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

暴力法, 通用写法 vs 列表推导式, 看到 leetcode 上的 耗时 时快时慢,也是茫然。。。  这两种方法耗时均为 O(n2)class Solution:def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""for i,v in enumerate(nums):for j in range(i+1,len(nums)):if v+nums[j] == target:return [i,j]else:raise ValueError('未找到这样的数字')# return [[i,j] for i,v in enumerate(nums) for j in range(i+1,len(nums))  if v+nums[j] == target ]nums = [2, 7, 11, 15]
target = 9
s = Solution()
s.twoSum(nums,target)# 列表推导式
class Solution:def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""return [[i,j] for i,v in enumerate(nums) for j in range(i+1,len(nums))  if v+nums[j] == target ]nums = [2, 7, 11, 15]
target = 9
s = Solution()
s.twoSum(nums,target)# 根据阅读提示,改写为 字典 查找法 (两遍遍历哈希表) 缩短 算法耗时 O(n)
class Solution:def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""d = {}[d.update({v:i}) for i,v in enumerate(nums)]for i,v in enumerate(nums):if (target - v) in d and i!= d[target - v]:return [i,d[target - v]]nums = [2, 7, 11, 15]
target = 9
s = Solution()
s.twoSum(nums,target)# 根据提示,遍历一遍 哈希表方法class Solution:def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""d = {}for i,v in enumerate(nums):value = target - vif value in d and d[value] != i:return [d[value],i]d.update({v:i})nums = [2, 7, 11, 15]
target = 9
s = Solution()
s.twoSum(nums,target)总结 , 可以看到算法依次是 暴力法(嵌套for 两次) O(n2)  --》 两遍遍历哈希表(O(n))  --》一遍遍历哈希表 O(n)

第二题

# 在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。# 字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。# 当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。# 若函数不能执行有效的转换,返回 0。
import re
import math
class Solution:def myAtoi(self, str):""":type str: str:rtype: int"""pattern = re.compile(r'(-?\d+)')res = pattern.search(str)if not res:raise TypeError('Error')else:res = int(res.group(1))if res < math.pow(-2,31) or res > math.pow(2,31):raise ValueError('超出范围啦!')return ress = Solution()print(s.myAtoi('42'))
print(s.myAtoi('-42'))
print(s.myAtoi('4193 with words'))
print(s.myAtoi('words and 987'))
s.myAtoi('-91283472332')ps: 要想通过 leetcode 的 检测呢。。。还是用下面的吧,虽然,都是些 煞笔错误造成不通过# 在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。# 字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。# 当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。# 若函数不能执行有效的转换,返回 0。
import re
import math
class Solution:def myAtoi(self, str):""":type str: str:rtype: int"""str = str.strip()if not str:return 0pattern = re.compile(r'(^([-|+]?|\d)\d+)')res = pattern.search(str)if not res:return 0 #raise TypeError('Error')else:res = int(res.group(1))if res < math.pow(-2,31):res = int(math.pow(-2,31))    # raise ValueError('超出范围啦!')if res >= math.pow(2,31):res = int(math.pow(2,31))-1return ress = Solution()
s.myAtoi('      -42')

第三题

给定一个 32 位有符号整数,将整数中的数字进行反转。示例 1:输入: 123
输出: 321示例 2:输入: -123
输出: -321
示例 3:输入: 120
输出: 21
注意:假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。import re
import mathclass Solution:def reverse(self, x):""":type x: int:rtype: int"""if str(x)[0] == '-':s = str(x)[1:]x = int('-'+s[::-1])if math.pow(-2,31) -1 <= int(x) <= math.pow(2,31):return xelse:return 0else:s = str(x)[::-1]x = int(s)if math.pow(-2,31) -1 <= int(x) <= math.pow(2,31):return xelse:return 0

分治法应用, 快排

package com.utils;public class Demo {public static void main(String [] args){int [] array = {3,2,1,4,8,7,6,9};printArray(array);quickSort(array,0,array.length-1);printArray(array);}public static void printArray(int [] array){System.out.print("[");for(int i=0;i<=array.length-1;i++){if(i == array.length-1){System.out.println(array[i]+"]");}else{System.out.print(array[i]+",");}}}public static int [] quickSort(int [] array,int low,int high){if(low<high){int l = low;int r = high;int base = array[l]; // 确定 每次排序的基准值// 右到左,寻找比基准值小的,如果没有r指针一直左移while(l<r && array[r]>=base){r--;}// 跳出了上面的循环从右到左找到了比基准值 base 小的第一个值if(l<r){array[l++] = array[r];}// 左到右,寻找比基准值大的,如果没有 l 指针一直右移while(l<r && array[l]<=base){l++;}// 跳出了上面紧挨着的循环意味着 找到了第一个比基准值大的第一个值if(l<r){// 这里考虑边界问题array[r--] = array[l];// 为何 r 要左移,因为这个坑已经被确定当然继续往前找啦}// 当上面所有操作都已完成意味着 第一趟排序完成,那么最后要把基准值填入array[l]array[l] = base;// 递归调用快排,分别对base 分成的两个区进行同样操作quickSort(array,low,l-1);quickSort(array,r+1,high);}return array;}
}

二分法 查找 前提 列表有序

nums = [1,2,3,4,5,6,7,8,9,10]
def bisearch(n,nums):low, high = 0,len(nums)-1while low<=high:mid = (low + high) //2
#         print(low,'--',mid,'--',high)if n>nums[mid]:low = mid+1elif n<nums[mid]:high = mid -1else:return midreturn 'Not Found!'[bisearch(i,nums) for i in range(1,11)][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

转载于:https://www.cnblogs.com/Frank99/p/9400239.html

python -- leetcode 刷题之路相关推荐

  1. LeetCode 刷题之路(python版)

    摘自:https://blog.csdn.net/qq_32384313/article/details/90745354 LeetCode 刷题之路(python版) 小坏wz 2019-06-02 ...

  2. LeetCode刷题之路(四)——medium的进阶

    Problem 29:Divide Two Integers   不使用除法.乘法和求余运算,完成两个数的除法,当数值溢出时,返回MAX_INT.   解题思路:第一想法,直接用被除数循环减去除数,每 ...

  3. python——LeetCode刷题

    文章目录(每天两题) leetcode1 两数之和 class Solution:def __init__(self,nums,target,dictnum ={}):self.nums = nums ...

  4. leetcode 刷题之路 64 Construct Binary Tree from Inorder and Postorder Traversal

    Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume tha ...

  5. #leetcode刷题之路35-搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...

  6. #leetcode刷题之路39-组合总和

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...

  7. Python——LeetCode刷题——【387. 字符串中的第一个唯一字符】

    题目描述: 解题思路: 逐个遍历字符串中的每个字符.用字典记录在字符串中每个字符的出现次数.最后遍历字符串中每个字符,字典中该字符作为key对应的value值为1,return首个value值为1的字 ...

  8. Python——LeetCode刷题——【977. 有序数组的平方】

    题目描述: 解题思路: 方法一:平方之后直接进行排序 小知识点 sorted和sort的不同点是: (1)sort是对list进行的排序,而sorted是内建函数,可以对一切可以迭代的对象进行排序. ...

  9. LeetCode刷题之路:1049. 最后一块石头的重量 II

    有一堆石头,用整数数组 stones 表示.其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x < ...

最新文章

  1. LDD3学习之short
  2. AsyncTask中各个函数详细的调用过程,初步实现异步任务
  3. 上海11月份计算机方面的会议,计算机类 | 10月截稿会议信息6条
  4. linux 查看 CPU 使用率
  5. 1.php查询数据,查询数据 - ThinkPHP 5.1 完全开发手册
  6. 经历了px、em之后,用 rem 适配屏幕
  7. SQL中sa 用户不能连接解决方案
  8. 给一个网址传递参数,并接收返回的参数
  9. 免费分享20套PHP源码
  10. 与体育行业有关的e–r图_国家体育产业统计分类
  11. qqkey获取原理_征途手机版电脑版安装使用教程【安卓+ios电脑版图文攻略】
  12. 让你的淘宝宝贝上首页,每月销量1000+的淘宝排名算法技巧
  13. 江苏省南京市谷歌高清卫星地图下载
  14. 成人高考计算机专业,成人高考计算机专业难吗?
  15. 浅谈npm和yarn的区别
  16. dsolve 的 用法
  17. 福昕阅读器常用快捷键
  18. StratoVirt 中的 PCI 设备热插拔实现
  19. 抽奖活动mysql表设计_购物商城数据库设计-商品表设计
  20. 掰碎了的正则表达式 : Java 篇

热门文章

  1. wxPython 笔记(3)基本结构
  2. [转]php初级教程(七)一个新闻管理系统(准备工作)
  3. 多写写 leetcode 43. 字符串相乘
  4. “中文四六级”考试来了!《国际中文教育中文水平等级标准》发布
  5. Linux系统查看分区文件系统类型
  6. au vst插件_失真效果音频插件
  7. mysql php commit_php mysqli_autocommit()使用实例
  8. 10个数冒泡排序流程图_C语言 | 冒泡排序
  9. 011_AOP注解开发
  10. MyBatis之使用JSONObject代替JavaBean优雅返回多表查询结果