Dayx2:剑指offer

2024-06-23 23:38
文章标签 offer dayx2

本文主要是介绍Dayx2:剑指offer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 第N个数字 Leecode400
    在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …中找到第 n 个数字。
    注意:
    n 是正数且在32位整数范围内 ( n < 231)。

在这里插入图片描述
复杂度分析
时间复杂度:O(N)O(N)。
空间复杂度:O(1)O(1)。

import math
def findNthDigit(self, n: int) -> int:# 首先判断target是几位数,用digits表示base=9digits=1while n-base*digits>0:n-=base*digitsbase*=10digits+=1#计算target值first_number = 10**(digits-1)target=first_number+ math.ceil(n/digits) - 1 #!!!math.ceil保证n=30[21/2-1=9而不是10的错误] 结果不会从20减到19# 找到target中对应的数字return int(str(target)[(n-1)%digits])
  1. 把数组排成最小的数
    输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
    e.g:输入数组[3, 32, 321],则打印出这3个数字能排成的最小数字321323。
def PrintMinNumber(self, numbers):if not numbers: return ""num=map(str,numbers)num.sort(lambda x,y:cmp(x+y,y+x))   #python2 #等价于num.sort(cmp=lambda x,y:cmp(x+y,y+x))#return "".join(num)#python3
from functools import cmp_to_key
def PrintMinNumber(self, numbers):from functools import cmp_to_keyif not numbers: return ""num=list(map(str,numbers))num.sort(key=cmp_to_key(self.cmp))#nums.sort(key=cmp_to_key(lambda a, b: (a + b > b + a) - (a + b < b + a)))return int(''.join(num))def cmp(self,a,b):s1=a+bs2=b+aif s1>s2: return 1elif s1<s2: return -1else: return 0

特别感谢:python中sort()方法的cmp参数

  1. 把数字翻译成字符串
    给定一个数字,我们按照如下规则把它翻译为字符串:
    0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。

在这里插入图片描述
python中str是可以比较大小的 '10'<'30'; 返回True

敲重点:dp
#原书的题。从0开始表示。范围为‘0’ ~ ‘25’
def numDecodings(self, s: str) -> int:n=len(str)f=[0]*(n+1)f[0],f[1]=1,1for i in range(2,n+1):if '10'<=s[i-2:i] <='25':     #注意:s[0]~s[n-1]f[i]=f[i-2]+f[i-1]else:f[i] = f[i - 1]return f[n]#范围为‘1’ ~ ‘26’
def numDecodings(self, s: str) -> int:if s[0]=='0' or not s:return 0n=len(s)f = [0] * (n + 1)f[0], f[1] = 1, 1for i in range(2,n+1):if s[i-1]=='0':if s[i-2] in {'1','2'}:f[i]=f[i-2]else:return 0else:if '10' <= s[i - 2:i] <= '26':  # 注意:s[0]~s[n-1]f[i] = f[i - 2] + f[i - 1]else:f[i] = f[i - 1]return f[n]
  1. 礼物的最大价值
    在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。
    可从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格直到到达棋盘的右下角。
    请计算你最多能拿到多少价值的礼物?

在这里插入图片描述
注意:下标从1开始算,不用处理边界问题。f[i - 1]不会越界。

def getMaxValue_2(self, grid):"""优化空间O(n)"""rows,cols=len(grid),len(grid[0])f=[0]*(cols+1)   #If matrix初始化f=[[0]*(cols+1) for _ in range(rows+1) ]for i in range(1,rows+1):for j in range(1,cols+1):f[j]=max(f[j],f[j-1]) + grid[i][j]  #!!!f[j]是上一行的j列results存储;f[j-1]是目前行的j-1列results存储return f[cols]

更general 见下

#次优 之matrix版  
f=[[0]*(cols+1) for _ in range(rows+1) ]
for i in range(1, rows + 1):for j in range(1, cols + 1):f[i][j]=max(f[i-1][j]+f[i][j-1]) + grid[i][j]return f[rows][cols]

#变形练习
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。
总共有多少条不同的路径?

def uniquePaths(self, m: int, n: int) -> int:"""优化空间O(n)"""rows,cols=m,nf=[1]*colsfor i in range(1,rows):for j in range(1,cols):f[j]=f[j]+f[j-1]return f[-1]

更general 见下

class Solution:def uniquePaths(self, m: int, n: int) -> int:rows,cols=m,nf=[[0]*(cols) for _ in range(rows) ]  #!!!f[m-1][n-1]for i in range(m): f[i][0]=1for j in range(n): f[0][j]=1for i in range(1,rows):  #!!!从1 startfor j in range(1,cols):f[i][j]=f[i-1][j]+f[i][j-1]return f[-1][-1]
  1. 无重复字符的最长子串 Leecode 3
    给定一个字符串,请找出其中不含有重复字符的 最长子串 的长度。

在这里插入图片描述

'''优化的滑动窗口'''
def lengthOfLongestSubstring_2(self, s: str) -> int:maxlen,l=0,0pos={} #dictfor idx, ch in enumerate(s):if ch in pos:l=max(pos[ch]+1, l)maxlen = max(maxlen, idx-l+1)pos[ch]=idx  #!!!updatereturn maxlen'''滑动窗口'''
#[双指针算法]当窗口内出现重复字符时,移除左边元素直到删除重复元素,继续移动窗口右端。
def lengthOfLongestSubstring(self, s: str) -> int:if not s: return 0maxlen, l = 0, 0mem=set() #窗口的元素(变动的)for idx in range(len(s)):while s[idx] in mem:mem.remove(s[l])  #先remove;再l+=1l=l+1mem.add(s[idx])maxlen=max(maxlen, idx-l+1)return maxlen

Set remove() 方法 注意:
该方法不同于 discard() 方法,因为 remove() 方法在移除一个不存在的元素时会发生错误,而 discard() 方法不会。

这篇关于Dayx2:剑指offer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088606

相关文章

20190315 把整理和培养自己当作一生的事业,而不是局限在找工作拿offer。

把整理和培养自己当作一生的事业,而不是局限在找工作拿offer,做有本事的人。 来东南读研半年了,明显感觉自己掌握的不过是书本知识级别的中上水平,垃圾收集器这些的只知道背面经,靠脑子硬记,缺乏整理和系统,一头浆糊。 现在一边做实训这个烂项目,一边刷面经,一边刷剑指offer,想投些大公司的实习,又觉得还没准备好,看着各 种面经,都能说个大概,但明显感觉到自己知识的不体系和不深入,**做的项目

【简历】25届南京某一本JAVA简历:简历通过率还好,但是拿不到OFFER

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 今天看一份25届南京某一本大学的Java简历。 这个简历呢,学校是一本。我们说上来先要定校招层次,这个层次就按照中厂来讲。因为现在很多的双非一本目标都是在中厂。 这个同学有个实习经历,一本有八成的同学主项目都是重复的。HR他只能看到项目重不重复,要点对不对他不知道,就从这个角度来看,这位同学

所以说读者们才是最优秀的 | 某读者喜提offer(+85%)后的分享

点击上方蓝色字体,选择“设为星标” 回复”资源“获取更多资源 这是小编的一个读者喜提offer后在群里做的分享,文中隐藏了读者的个人隐私信息,小编这里把他的面经分享出来供大家学习。  群友们看到后都纷纷表示【我酸了,现在我就是个柠檬精系列】。 小编现在也是个柠檬精????????????????????????????????。 小编现在是群里最菜的了。     关于如何学习/准备面试的总结

剑指offer——替换字符

/*** 剑指offer* 替换字符*/import java.util.Scanner;public class Solution {public String replaceSpace(StringBuffer str) {String s=str.toString();StringBuilder st=new StringBuilder(); for(int i=0;i<s.leng

剑指offer——第一次只出现一次的字符

/*** */package interview35;/*** 第一次只出现一次的字符* 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置*@author: Administrator*@date: 2017-1-9 下午07:34:07*/import java.util.Scanner;public class Solutio

ssh登录服务器报错“no matching host key type found. Their offer: ssh-rsa,ssh-dss”解决方法

这个错误表明你尝试使用 ssh 连接到远程服务器时,客户端和服务器之间没有匹配的 host key 类型。具体来说,远程服务器提供了 ssh-rsa 和 ssh-dss 类型的 host key,但你的 SSH 客户端配置可能不再支持这些较旧的算法。最近的 OpenSSH 版本默认禁用了不够安全的算法,如 ssh-rsa 和 ssh-dss。 解决方法 临时启用 ssh-rsa: 你可以在

Accept CS Ph.D. Offer from Stony Brook University,去SUNY石溪大学的CS Ph.D.啦

前言:在2017年3月24日,正式决定去纽约州立大学石溪分校(State University of New York, Stony Brook,简称石溪大学),CS Ph.D. 项目。本科直博,DIY申请,全额奖学金,第一年5.1万美元(免学费2.2万,2017 fall, 2018 spring 的TA 1.93万,2018 summer RA 1万,没有 Fellowship) Abs

牛客《剑指Offer》 -- 数值的整数次方

题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路 特别注意负数的情况,出现负数,将其转化为正数然后求倒数。 class Solution {public:double Power(double base, int exponent) {double total = 1;bool flag = false

牛客网《剑指Offer》 二进制中1的个数

题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路 负数用补码,其实就是求一个数据在计算机中是存储是怎么样子的。用位运算,就能很好实现。 class Solution {public:int NumberOf1(int n) {int count = 0;int flag = 1;while (flag != 0) {if ((n & f

牛客网《剑指Offer》 矩形覆盖

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution {public:int rectCover(int number) {if(number==0) return 0;if(number==1) return 1;if(number==2) return 2;retu