算法(17)-leetcode-剑指offer1

leetcode-剑指offer-1

  • 1.面试题3-数组中的重复数字
  • 2.面试题04-二维数组中的查找
  • 3.面试题05-替换空格
  • 4.面试题06-从尾到头打印链表
  • 5.面试题07-重建二叉树
  • 6.面试题09-两个堆栈实现队列
  • 7.面试题10-1-斐波那契数列
  • 8.面试题10-2-青蛙跳台阶问题
  • 9.面试题11-旋转数组的最小数字
  • 10.面试题12-矩阵中的路径

本系列博文为题库刷题笔记,(仅在督促自己刷题)如有不详之处,请参考leetcode官网:https://leetcode-cn.com/problemset/lcof/

编程语言为python

1.面试题3-数组中的重复数字

在一个长度为n的数组里,所有的数字都在0-n-1的范围内,数组中某些数字是重复了的,但是不知道有几个数字是重复了的,也不知道每个数组的重复次数。请找出数组中任意一个重复的数字:
hash表存储遍历过的数字,如果表中已经存在,直接返回。

class Solution(object):def findRepeatNumber(self, nums):""":type nums: List[int]:rtype: int"""vis_has={}for val in nums:if vis_has.get(val):   #访问字典的键值都用这个方法return valelse:vis_has[val]=True

leetcode 287.寻找重复数字
给定一个包含n+1个整数的数组,其中数字都在1-n之间,可知至少存在一个重复数字。假设只存在一个重复整数,找出这个重复的数。
要求:
不能更改原数组(假设数组是只读的)。
只能使用额外的 O(1) 的空间。–不能用hash表
时间复杂度小于 O(n2) 。–暴力法的时间复杂度是o(n2)
数组中只有一个重复的数字,但它可能不止重复出现一次。
–弗洛伊德兔子乌龟。如果有重复数字,那么就会有至少两个索引指向相同的数字,这就是链表中成环的条件。检验链表入环节点就是重复的数字。
vi=nums[i],指向下一个索引

class Solution(object):def findDuplicate(self, nums):""":type nums: List[int]:rtype: int"""t=nums[0]r=nums[0]while True:t=nums[t]r=nums[nums[r]]if t==r:breakr=nums[0]while t!=r:t=nums[t]r=nums[r]return t

2.面试题04-二维数组中的查找

在一个nm的二维数组中,每一行都按照从左往右递增的顺序,每一行都按从左到右递增顺序排序,每一列都按照从上到下递增顺序排列,完成在二维数组中查找指定数,在返回true,不在返回false.(与leetcode240一致)
思路1:暴力搜索,忽略有序条件,时间复杂度o(n
m)
思路2:线性查找,从数组的右上角开始搜索:

  • nums[0][n-1]==target: return true
  • nums[0][n-1]<target: 去更大的区域查找,行坐标加1,
  • nums[0][n-1]>taget: 去更小的区域查找,列坐标减1
    直至行列索引不符合条件,时间复杂度o(n+m)
class Solution(object):def findNumberIn2DArray(self, matrix, target):""":type matrix: List[List[int]]:type target: int:rtype: bool"""m=len(matrix)if m==0:return Falsen=len(matrix[0])i,j=0,n-1while(-1<i<m and -1<j<n):if matrix[i][j]==target:return Trueelif matrix[i][j]<target:i+=1else:j-=1return False

3.面试题05-替换空格

请实现一个函数,把字符串中的空格替换成“%20”。
考察的是字符串可变不可变,转义字符的输出?
直接想法:新建一个res_str,遍历原字符串,按要求复制一份。–python操作十分方便

class Solution(object):def replaceSpace(self, s):""":type s: str:rtype: str"""res_str=""for char in s:if char==" ":res_str+="%20"else:res_str+=charreturn res_str

4.面试题06-从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
思路1:先将链表反转,然后打印输出就可以了。

class Solution(object):def reversePrint(self, head):""":type head: ListNode:rtype: List[int]"""if head==None:return []pre_node=Nonecur_node=headwhile(cur_node):next_node=cur_node.nextcur_node.next=pre_nodepre_node=cur_nodecur_node=next_noderes=[]new_node=pre_nodewhile(new_node):res.append(new_node.val)new_node=new_node.nextreturn res

思路2:将链表正序输出,将结果res逆序输出就好。

class Solution(object):def reversePrint(self, head):""":type head: ListNode:rtype: List[int]"""if head==None:return []res=[]cur_node=headwhile(cur_node):res.append(cur_node.val)cur_node=cur_node.nextreturn res[::-1]

5.面试题07-重建二叉树

leetcode 105:从前序与中序遍历序列构二叉树

6.面试题09-两个堆栈实现队列

用两个堆栈实现一个队列。请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数(若队列中没有元素,deleteHead操作返回-1)

堆栈先进后出,队列先进先出

方案1:
两个栈
主栈:存队列。需要添加元素时,将原有的所有元素押入辅助栈,将元素押入栈底,然后将辅助栈的元素押回主栈。删除元素,直接弹出栈顶元素
辅助栈:辅助主栈实现存元素操作,这个思路主要保证:先存入的元素在栈顶。

class CQueue(object):def __init__(self):self.main_stack=[]self.help_stack=[]def appendTail(self, value):""":type value: int:rtype: None"""if self.main_stack==[]:self.main_stack.append(value)else:while(self.main_stack):self.help_stack.append(self.main_stack.pop())self.main_stack.append(value)while(self.help_stack):self.main_stack.append(self.help_stack.pop())def deleteHead(self):""":rtype: int"""if self.main_stack==[]:return -1return self.main_stack.pop()

4024ms 17.3MB

方案1主要费时在添加一个新元素的时候,需要移动主栈内的所有元素,然后将所有元素押回来,保证最先存入的元素在主栈顶。
改进方案:
插入元素:维护一个主堆栈,每次加元素,往堆栈顶添加元素就可以了
删除元素:维护一个辅助堆栈,需要弹出元素时将主栈的元素弹入辅助栈,那么第一个入主栈的元素将出现在辅助栈顶,直接将其弹出。重点:此时不需要将剩余元素弹回主栈,因为下一次删除操作对象还是在辅助栈栈顶。所以弹出操作:检查辅助栈是否为空,为空将主栈中元素弹入辅助栈中,弹出辅助栈栈顶即可。时间快了3倍数。

class CQueue(object):def __init__(self):self.main_stack=[]self.help_stack=[]def appendTail(self, value):""":type value: int:rtype: None"""self.main_stack.append(value)def deleteHead(self):""":rtype: int"""if self.main_stack==[] and self.help_stack==[]:return -1if self.help_stack==[]:while(self.main_stack):self.help_stack.append(self.main_stack.pop())return self.help_stack.pop()

1816ms 17.4MB

7.面试题10-1-斐波那契数列

写一个函数,求输入n的斐波那契数列的第n项。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

class Solution(object):def fib(self, n):""":type n: int:rtype: int"""if n==0:return 0if n==1:return 1prepre_f=0pre_f=1f=0for i in range(2,n+1):   f=pre_f+prepre_fprepre_f=pre_fpre_f=freturn f%(10**9+7)

循环求余法用于解决大数越界问题,python可以不用考虑大数越界问题。

8.面试题10-2-青蛙跳台阶问题

一只青蛙一次可以跳一阶台阶,也可以跳2阶台阶。求该青蛙跳上一个n阶台阶总共有多少总跳法。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

f(i)表示跳到第i个台阶的方法数,它可以由i-1个台阶跳上来,也可以从i-2个台阶跳上来。所以这两种方式所拥有的方法数相加就是跳上第i阶台阶有的方法数,即f(i)=f(i−1)+f(i−2)f(i)=f(i-1)+f(i-2)f(i)=f(i1)+f(i2)。看到这个表达式,不就是斐波那契数列么?再求一次斐波那契数列就好了,唯一的区别就是初始条件prepre_f应该初始化为1,pre_f初始化为1。

class Solution(object):def numWays(self, n):""":type n: int:rtype: int"""if n==0:return 1if n==1:return 1prepre_f=1pre_f=1for i in range(2,n+1):f=pre_f+prepre_fprepre_f=pre_fpre_f=freturn f%(10**9+7)

9.面试题11-旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。

思路1:暴力找一个数组最小o(n)

class Solution(object):def minArray(self, numbers):""":type numbers: List[int]:rtype: int"""n=len(numbers)res=float("INF")for val in numbers:res=min(res,val)return res

思路2:二分查找,初始化l=0,r=len(numbers),用中点mid=(l+r)//2将数组分成两个部分。判断是否两边都有序:旋转点在无序的那一边

class Solution(object):def minArray(self, numbers):""":type numbers: List[int]:rtype: int"""n=len(numbers)if n==0:return Nonel,r=0,n-1while(l<r):mid=(l+r)//2if numbers[mid]>numbers[r]:  # 右边无序,旋转点在右边,numbers[mid]比右端点都大,最小肯定不是它l=mid+1elif numbers[mid]<numbers[r]: # 右边有序,最小可能是numbers[mid]r=midelse:r-=1return numbers[r]

10.面试题12-矩阵中的路径

请设计一个函数,用来判断在一个矩阵是否存在一条包含某字符串所有字符的路径。路径可以总矩阵的任意一个格子开始,每一步可以在矩阵中向左、向右、向上、向下移动一格。如果一条路径经过了某一格子,那么该路径不能再次进入该格子。

dfs递归遍历。以每个位子开始,寻找该匹配的字符串。有一个visted矩阵用于记录哪些格子已经遍历过了:
保护现场和恢复现场的问题

class Solution(object):def exist(self, board, word):""":type board: List[List[str]]:type word: str:rtype: bool"""m=len(board)if m==0:return Falsen=len(board[0])visted=[]visted=[[False]*n for _ in range(m)]def dfs(string,i,j):if len(string)==1 and string[0]==board[i][j]:return Trueif string[0]==board[i][j]:visted[i][j]=Trueif i-1>-1 and visted[i-1][j]==False:if  dfs(string[1:],i-1,j):return Trueif i+1<m  and visted[i+1][j]==False:if dfs(string[1:],i+1,j):return Trueif j-1>-1 and visted[i][j-1]==False:if dfs(string[1:],i,j-1):return Trueif j+1<n and visted[i][j+1]==False:if dfs(string[1:],i,j+1):return Truevisted[i][j]=Falsereturn Falsefor i in range(m):for j in range(n):if dfs(word,i,j):return Truereturn False

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蚁群算法的一些东西

运行了三个TSP经典用例,基本符合要求。仅仅是一份按照蚁群算法的原理写的代码,没有做任何优化。 // bigSearch.cpp : 定义控制台应用程序的入口点。 // #include<iostream> #include<math.h> #include<time.h> using namespace std; //该程序是以…

leetcode101 对称二叉树

给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 说明: 如果你可以运用递归和迭…

Linux内核OOM机制的详细分析

Linux 内核有个机制叫OOM killer&#xff08;Out-Of-Memory killer&#xff09;&#xff0c;该机制会监控那些占用内存过大&#xff0c;尤其是瞬间很快消耗大量内存的进程&#xff0c;为了防止内存耗尽而内核会把该进程杀掉。典型的情况是&#xff1a;某天一台机器突然ssh远程登…

算法(18)-leetcode-剑指offer2

leetcode-剑指offer-211.面试题13-机器人的运动范围-广度优先搜索12.面试题14-1-剪绳子13.面试题14-2-剪绳子214.面试题16-二进制中1的个数-布莱恩克尼根15.面试题16-数值的整数次方-快速幂解析法16.面试题17-打印从1到最大的n位数17.面试题18-删除链表的节点18.面试题19-正则匹…

rabbitmq技术的一些感悟(一)

Rabbitmq 初识rabbitmq RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。如果不熟悉AMQP,直接看RabbitMQ的文档会比较困难。不过它也只有几个关键概念,这里简单介绍 几个概念说明: Broker

leetcode21 合并两个链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4 思路&#xff1a;链表归并。 /*** Definition for si…

rabbitmq技术的一些感悟(二)

上一节文章主要是说了一下rabbitmq的安装以及搭建好环境的一些命令,以及常用的api调用,其实自从google被封掉之后,我之前收藏的很多技术连接都已经被禁止访问了,这个是多么可悲的一件事情啊,说多了都是泪。 首先,我先写一段消费者的模块,建立连接,初始化amq以及销毁连接…

算法(19)-leetcode-剑指offer3

leetcode-剑指offer-321.面试题22-链表中的倒数第k个节点22.面试题24-反转链表23.面试题25-合并两个排序链表-递归24.面试题26-树的子结构25.面试题27-二叉树的镜像26.面试题28-对称二叉树27.面试题29-顺时针打印矩阵28.面试题30-包含min函数的栈29.面试题31-栈的押入&#xff…

高效解析xml的总结,闲下来写的

需要这么几个库&#xff0c;直接放在你的代码工程里即可&#xff1a; #include "rapidxml.h" #include "rapidxml_utils.h" int ReBornBossConf::loadConf(const char* szFileName){ rapidxml::file<char> fdoc(szFileName); rapidxml::xml_docum…

leetcode35 插入的位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 思路&#xff1a;二分查找 public class Solution {public int searchInsert(i…

算法(20)-leetcode-剑指offer4

leetcode-剑指offer-433.面试题33-二叉搜索树的后序遍历序列34.面试题34-二叉树中和为某一值的路径35.面试题35-复杂链表的复制36.面试题36-二叉搜索树与双向链表37.面试题37-序列化二叉树38.面试题38-字符串的排列39.面试题39-数组中出现次数超过一半的数字40.面试题40-最小的…

关于linux的进程中的各个线程cpu占用情况的分析和查看

我们经常会在新开的服搭建一个游戏的服务器,有时候要进行压力测试,那么如何来看呢,一般我们会通过top命令查看各个进程的cpu和内存占用情况,获得到了我们的进程id,然后我们也许会通过pstack命令查看里边的各个线程id以及对应的线程现在正在做什么事情,分析多组数据就可以…

算法(21)-leetcode-剑指offer5

leetcode-剑指offer-443.面试题43-1&#xff5e;n整数中1出现的次数44.面试题44-数字序列中某一位的数字45.面试题45-把数组排成最小的数-快排变种46.面试题46-把数字翻译成字符串47.面试题47-礼物的最大价值-dp48.面试题48-最长不含重复字符的子字符串-滑动窗口法49.面试题49-…

游戏中DDA算法和Bresenham算法的应用

在角色扮演或即时战略游戏中,经常会将角色以最佳的方式走到指定地点。游戏场景的地面情况复杂,而且场面大,若采用盲目式搜索,例如盲目穷举法,则几乎要遍历整个场景,效率非常低,造成角色反应速度过慢,实践证明是一种不适合网络游戏寻路方法。而启发式搜索算法在障碍较少的情况下…

leetcode7 整数反转

给出一个 32 位的有符号整数&#xff0c;你需要将这个整数中每位上的数字进行反转。 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假设我们的环境只能存储得下 32 位的有符号整数&#xff0c;则其数值范围为 [−231, …

关于苹果purchase的验证

用户在购买苹果的商品的过程如下:

算法(23)-leetcode-剑指offer7

leetcode-剑指offer-559.面试题59-队列的最大值60.面试题64-求12...n61.面试题65-不用加减乘除做加法62.面试题66-构建乘积数组63.面试题68-1二叉树搜索树的最近公共祖先64.面试题68-2二叉树的最近公共祖先65.面试题67-把字符串转换成数字-自动机66.面试题20-表示数值的字符串-…

C/C++ 获得公网ip地址和内网ip

获得公网ip:bool getPublicIp(string& ip) {int sock;char **pptr = NULL;struct sockaddr_in destAddr;struct hostent *ptr = NULL;char destIP[128];sock = socket(AF_INET,SOCK_STREAM,0);if( -1 == sock ){perror("creat socket failed");return …

终于,我读懂了所有Java集合——List篇

ArrayList 基于数组实现&#xff0c;无容量的限制。 在执行插入元素时可能要扩容&#xff0c;在删除元素时并不会减小数组的容量&#xff0c;在查找元素时要遍历数组&#xff0c;对于非null的元素采取equals的方式寻找。 是非线程安全的。 注意点&#xff1a; &#xff08…

关于长连接和短连接

短连接 连接->传输数据->关闭连接 HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。 也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。