第一题

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

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

示例:

给定 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 - v
if 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 res s = 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 0 pattern = 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))-1
return res s = Solution()
s.myAtoi(' -42')

第三题

给定一个 32 位有符号整数,将整数中的数字进行反转。

示例 1:

输入: 123
输出: 321
示例 2: 输入: -123
输出: -321
示例 3: 输入: 120
输出: 21
注意: 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。 import re
import math class 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 x
else:
return 0
else:
s = str(x)[::-1]
x = int(s)
if math.pow(-2,31) -1 <= int(x) <= math.pow(2,31):
return x
else:
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)-1
while low<=high:
mid = (low + high) //2
# print(low,'--',mid,'--',high)
if n>nums[mid]:
low = mid+1
elif n<nums[mid]:
high = mid -1
else:
return mid
return 'Not Found!' [bisearch(i,nums) for i in range(1,11)] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

python -- leetcode 刷题之路的更多相关文章

  1. Python学习之LeetCode刷题之路——简单题【1、7、9】

    1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...

  2. 使用Java+Kotlin双语言的LeetCode刷题之路(三)

    BasedLeetCode LeetCode learning records based on Java,Kotlin,Python...Github 地址 序号对应 LeetCode 中题目序号 ...

  3. 使用Java+Kotlin双语言的LeetCode刷题之路(二)

    BasedLeetCode LeetCode learning records based on Java,Kotlin,Python...Github 地址 序号对应 LeetCode 中题目序号 ...

  4. 使用Java+Kotlin双语言的LeetCode刷题之路(一)

    LeetCode learning records based on Java,Kotlin,Python...Github 地址 序号对应 LeetCode 中题目序号 1 两数之和 给定一个整数数 ...

  5. #leetcode刷题之路40-组合总和 II

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的每个数字在每个组合中只能使用一次.说 ...

  6. #leetcode刷题之路16-最接近的三数之和

    给定一个包括 n 个整数的数组 nums 和 一个目标值 target.找出 nums 中的三个整数,使得它们的和与 target 最接近.返回这三个数的和.假定每组输入只存在唯一答案. 例如,给定数 ...

  7. #leetcode刷题之路13-罗马数字转整数

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M.字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 写 ...

  8. #leetcode刷题之路6- Z 字形变换

    将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列.比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:L     C     I ...

  9. 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 ...

随机推荐

  1. 从快感到成就感:多巴胺vs内啡肽

    从快感到成就感:多巴胺vs内啡肽 来源 https://zhuanlan.zhihu.com/p/24697188   作者:朱良      编辑于 2017-06-20 努力不一定成功,但不努力一定 ...

  2. 微信小程序API 文档快速参考索引

    内容那么多,这个页面到底做了什么? 第一:解决微信文档APi文档使用不便: 第二:解决了内容搜索与索引:—— 最好是写成全文索引文档,但是比较需要时间,而且更新是一件麻烦的事:所以以下是直接 连接官网 ...

  3. requirements文件

    将一个环境中安装的所有的包在另一个环境中安装 1.生成文件列表 pip freeze > requirements.txt 2.将该文件放入到新环境中,安装 pip install -r req ...

  4. [luogu1486][bzoj1503][NOI2004]郁闷的出纳员【平衡树treap】

    题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...

  5. 【转】使用STM32F4的CCM内存

    我们知道STM32F4当中有个CCM内存,如图所示,这个内存是挂在D总线上直接和内核相连,因此除了内核之外谁都不能访问,那么我们怎么将其利用起来呢?网上这个资料还真的很少,今天我就给大家分享一下,献给 ...

  6. MVC接收列表参数

    ASP.NET  MVC 表单参数如果有列表时要怎么写呢. 虽然很久不用MVC了,但几乎每次遇到一次就要研究一下.然后又忘了. 其实也明白这是未完全弄清楚表单参数的传递形式,如果明白了,就知道MVC为 ...

  7. Codeforces 1079D Barcelonian Distance(计算几何)

    题目链接:Barcelonian Distance 题意:给定方格坐标,方格坐标上有两个点A,B和一条直线.规定:直线上沿直线走,否则沿方格走.求A到B的最短距离. 题解:通过直线到达的:A.B两点都 ...

  8. NOIP2018保卫王国

    题目大意:给一颗有点权的树,每次规定两个点选还是不选,求这棵树的最小权点覆盖. 题解 ZZ码农题. 要用动态dp做,这题就是板子,然鹅并不会,留坑代填. 因为没有修改,所以可以静态倍增. 我们先做一遍 ...

  9. deque双端队列容器

    //deque双端队列容器 //deque双端队列容器与vector一样,采用线性表顺序存储结构,但与vector不同的是, //deque采用的分块线性存储结构来存储数据,每块的大小一般为512字节 ...

  10. Pycharm For Linux

    之前说过JetBrains系列的破解方式:https://www.cnblogs.com/dunitian/p/8478252.html 现在说下怎么固定到任务栏,速度版 详细讲解可以看之前说安装微信 ...