算法(21)-leetcode-剑指offer5

leetcode-剑指offer-4

  • 43.面试题43-1~n整数中1出现的次数
  • 44.面试题44-数字序列中某一位的数字
  • 45.面试题45-把数组排成最小的数-快排变种
  • 46.面试题46-把数字翻译成字符串
  • 47.面试题47-礼物的最大价值-dp
  • 48.面试题48-最长不含重复字符的子字符串-滑动窗口法
  • 49.面试题49-丑数-自底向上递归
  • 50.面试题50-第一个只出现一次的字符-hash表
  • 51.面试题52-两个链表的第一个公共节点-双指针技巧
  • 52.面试题53-在排序数组中找数字
  • 54.面试题53-2-0~n-1中的缺失数字--二分

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

43.面试题43-1~n整数中1出现的次数

输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。
完全参考:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/mian-shi-ti-43-1n-zheng-shu-zhong-1-chu-xian-de-2/
分请情况讨论某一位中1出现次数的计算方法。

class Solution(object):def countDigitOne(self, n):""":type n: int:rtype: int"""digit,res=1,0high,cur,low=n//10,n%10,0while(high!=0 or cur!=0):if cur==0:res+=high*digitelif cur==1:res+=high*digit+low+1else:res+=(high+1)*digitlow+=cur*digitcur=high%10high=high//10digit*=10return res

44.面试题44-数字序列中某一位的数字

数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字。
思路:寻找n 与对应数字的关系,应该有对应的公式规律。
数字:num=123
数字中一位数的数量:n=3
一个数字的位数:digit,123为3位数,dight=3
digit 位数的起始数字:1,10,100,记为start

数字范围start−endstart-endstartend以上三个量的递推公式为:
digit=digit+1
start=start10
count=9
start*dight

求解可以分为三步:
1.确定n所在的数字的位数,记为digit
2.确定n所在的数字,记为num
3.确定n是num中的哪一位,并返回结果

class Solution(object):def findNthDigit(self, n):""":type n: int:rtype: int"""digit,start,count=1,1,9# 1.计算n所在的位数区间[1-9]是一位数一共9个,[10,99]两位数一共90个while(n>count):n-=countstart*=10digit+=1count=9*start*digit# 计算在该开始区间内所对应的数字num=start+(n-1)//digit# 确定是数字的哪一位index=(n-1)%digitreturn int(str(num)[index])

45.面试题45-把数组排成最小的数-快排变种

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
问题:能拼接的数字很多么?找最小的一个

[10,2] 可以拼接成102,210,明显102最小

本质是一个排序问题:排序的目的是使得量级最小的数字排在最前面,使得最后按顺序拼接的时候,拼接的数字最小.

10,5两个数字谁在前?按位数来比较,如果放了5,组成的3位数以5开头,所以不能放5,所以应该先放10
总之就是按位排序,谁小谁先放(数字左对齐比较,看看谁小,先比的数字对比较结果起决定性作用)

比如30和3,30的量级比3小,30应该在3前面。将数字转换成字符串,拼接后比较:(“30”+“3”=“303”)<(“3”+“30”)=>“30”<“3”

改造快排排序规则:

class Solution(object):def minNumber(self, nums):""":type nums: List[int]:rtype: str"""def quick_sort_str(l,r,data):if l<r:p=patition(l,r,data)quick_sort_str(l,p-1,data)quick_sort_str(p+1,r,data)def patition(i,j,data):pivort=data[i]while(i<j):while(i<j and data[j]+pivort>pivort+data[j]): # 比较规则需要修改j-=1data[i]=data[j]while(i<j and data[i]+pivort<=pivort+data[i]):i+=1data[j]=data[i]data[i]=pivortreturn inums_str=[]for val in nums:nums_str.append(str(val))quick_sort_str(0,len(nums_str)-1,nums_str)res=""for char in nums_str:res+=charreturn res

46.面试题46-把数字翻译成字符串

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
dp[i] 表示nums[0]-nums[i-1] 能够翻译成的数字总数
dp 由前面的状态推导后面的状态。
在这里插入图片描述
这题有点类似与爬楼梯

class Solution(object):def translateNum(self, num):""":type num: int:rtype: int"""num_lis=[]while(num):num_lis.append(num%10)num//=10num_lis.reverse()n=len(num_lis)if n<2:return 1dp=[0]*(n+1)dp[0]=1dp[1]=1for i in range(2,n+1):val=10*num_lis[i-2]+ num_lis[i-1]    # 此位置和下一位置构成的数字[0,9],[10,15],[25,99]if 0<=val<10 or 26<=val<=99:     # 09,26,  nums[i]自己翻译,只有一种翻译方式dp[i]=dp[i-1]if 10<=val <26:                  # num=12, 2自己单独翻译,12一起翻译, dp[i]=dp[i-1]+dp[i-2]return dp[-1]

47.面试题47-礼物的最大价值-dp

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

递归所有的路径,时间超出限制(20/61)。最值问题,应该有最有子结构。

class Solution(object):def __init__(self):self.res=0def maxValue(self, grid):""":type grid: List[List[int]]:rtype: int"""m=len(grid)n=len(grid[0])def dfs(i,j,val):if i>=m or j>=n:return val+=grid[i][j]if i==m-1 and j==n-1:self.res=max(self.res,val)return # 要不要return 呢dfs(i+1,j,val)dfs(i,j+1,val)dfs(0,0,0)return self.res

动态规划解题:dp[i][j]到单元格(i,j) 的最大价值。

48.面试题48-最长不含重复字符的子字符串-滑动窗口法

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
滑动窗口法:[l,r] 中有一个hash表,统计每个字符的个数,当存在时,窗口变小,直至个数减为1.
再移动右端。

class Solution(object):def lengthOfLongestSubstring(self, s):""":type s: str:rtype: int"""win={}left,right=0,0res=0m=len(s)while(right<m):c1=s[right]if win.get(c1)==None:win[c1]=1else:win[c1]+=1right+=1while(win[c1]>1):c2=s[left]win[c2]-=1left+=1res=max(res,right-left) # 上面right+ 了1,所以直接减去return res

49.面试题49-丑数-自底向上递归

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。(质因子:因子是质数)
说明:
1 是丑数。
n 不超过1690。
思路:丑数的递归性质,丑数只包含质因子2,3,5,因此 丑数=某较小的丑数*某因子
暴力解法:时间超出限制404/595

class Solution(object):def nthUglyNumber(self, n):""":type n: int:rtype: int"""i=1num=1isun_hash={1:True,2:True,3:True,5:True}def is_UN(num):for val in [2,3,5]:if num%val==0 and isun_hash.get(num//val):return Truereturn Falsewhile(i<n):num+=1if is_UN(num) :isun_hash[num]=Truei+=1# print(i,num)return num

动态规划: 设动态规划列表 dp ,dp[i]代表第 i + 1个丑数。
利用状态更新求解dp[n-1] 即可。
用a,b,c 三个索引指向num[a]*2,nums[b]*3,nums[c]*5第一次超过dp[i-1]索引,dp[i] 就更新为最小的那个数。将a,b,c初始化为0,0,0,依次填充dp 序列

class Solution(object):def nthUglyNumber(self, n):""":type n: int:rtype: int"""dp=[1]*na,b,c=0,0,0for i in range(1,n):n2,n3,n5=dp[a]*2,dp[b]*3,dp[c]*5   dp[i]=min(n2,n3,n5)if dp[i]==n2:  # 只能用if ,n2,n3,n5可能会相等,这时需要同时更新下标a+=1if dp[i]==n3:b+=1if dp[i]==n5:c+=1return dp[-1]

50.面试题50-第一个只出现一次的字符-hash表

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

class Solution(object):def firstUniqChar(self, s):""":type s: str:rtype: str"""win_hash={}for char in s:if win_hash.get(char)==None:win_hash[char]=1else:win_hash[char]+=1for char in s: # 重新遍历一遍,使得返回的字符是最左边第一个出现的字符串if win_hash.get(char)==1:return charreturn " "

51.面试题52-两个链表的第一个公共节点-双指针技巧

输入两个链表,找出它们的第一个公共节点。
双指针技巧
注意点:先判断两个链表是否相交,如果相交,在寻找交点

class Solution(object):def getIntersectionNode(self, headA, headB):""":type head1, head1: ListNode:rtype: ListNode"""if headA==None or headB==None:return Nonepa,pb=headA,headBwhile(pa.next):pa=pa.nextwhile(pb.next):pb=pb.nextif pa!=pb:return Noneelse:pa,pb=headA,headBwhile(pa!=pb):if pa.next:pa=pa.nextelse:pa=headBif pb.next:pb=pb.nextelse:pb=headAreturn  pa

52.面试题53-在排序数组中找数字

统计一个数字在排序数组中出现的次数。
暴力求解:通过了!!

class Solution(object):def search(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""res=0for num in nums:if num==target:res+=1return res

大佬说还可以用二分法做。

54.面试题53-2-0~n-1中的缺失数字–二分

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
[0,1,3],n=4,l=4-1=3,数字范围[0,3] 一共n 中情况.
缺失数字的左边:nums[i]==i
缺失数字的位置上:nums[i]!=i
暴力:

class Solution(object):def missingNumber(self, nums):""":type nums: List[int]:rtype: int"""l=len(nums)for i in range(l):if nums[i]!=i:return ireturn l

二分查找:

class Solution(object):def missingNumber(self, nums):""":type nums: List[int]:rtype: int"""l=len(nums)i,j=0,l-1while(i<=j):      # 搜索到i>j的那个点就缺失点mid=(i+j)//2if nums[mid]==mid:i=mid+1   # 左边没有缺失else:j=mid-1   # 缺失已经发生,在左半段return i

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

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

相关文章

游戏中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连接后发送后接收完数据后马上断开连接。

C++(8)--数组array-长度固定

数组及常用算法1.数组基本概念2.一维数组2.1数组的定义2.2数组初始化2.3一维数组动态赋初值2.4一维数组应用实例2.5一维数组的排序算法2.6 一维数组元素的删除和插入array3.二维数组3.1数组定义3.2二维数组的动态赋值《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》…

关于去苹果服务器验证充值的一些看法

前端时间看了下关于app充值验证发送游戏金币的好多帖子和文章,也总结了一下app校验的php代码:可以参考我的上一封博客: http://blog.csdn.net/pbymw8iwm/article/details/42167125 其中这个帖子回复的大神比较多:点击打开链接 有些人认为拿苹果的receptdata去验证,通过返…

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

Stack 基于Vector实现&#xff0c;支持LIFO。 类声明 public class Stack<E> extends Vector<E> {} push public E push(E item) {addElement(item);return item; } pop public synchronized E pop() {E obj;int len size();obj peek();removeElementAt(…

IAP-应用内购买流程

成为ios开发者最大的好处就是&#xff0c;你编写的应用程序会有很多方式可以赚钱。比如&#xff0c;收费版&#xff0c;免费挂广告版&#xff0c;还有就是程序内置购买。 程序内置购买会让你爱不释手&#xff0c;主要有以下原因&#xff1a; 除了程序本身的下载收费以外&#x…

C++(8.5)--Vector容器

向量容器Vector1. 定义/初始化2. 遍历3. 常用操作vector 迭代器遍历&#xff0c;sort, reverse,1. 定义/初始化 vector是同一类型对象的集合&#xff0c;被称作容器。vector实际是一个类模版&#xff0c;可用于保存多种数据类型的数据&#xff08;确定类型的vector 就只能装同…

关于mysql的change和modify

前端时间要写个游戏里的邮件系统&#xff0c;定义了一个如下的表结构&#xff1a; CREATE TABLE sysmail (mailid int(20) NOT NULL AUTO_INCREMENT,sendtime int(11) NOT NULL DEFAULT 0,mailtitle varchar(512) COLLATE utf8_bin NOT NULL DEFAULT ,mailcontext varchar(2048…

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

首先&#xff0c;红黑树细节暂时撸不出来&#xff0c;所以没写&#xff0c;承诺年前一定写 HashMap &#xff08;底层是数组链表/红黑树&#xff0c;无序键值对集合&#xff0c;非线程安全&#xff09; 基于哈希表实现&#xff0c;链地址法。 loadFactor默认为0.75&#xff0…

valgrind工具使用详解

zz自 http://blog.csdn.net/destina/article/details/6198443 感谢作者的分享&#xff01; 一 valgrind是什么&#xff1f; Valgrind是一套Linux下&#xff0c;开放源代码&#xff08;GPL V2&#xff09;的仿真调试工具的集合。Valgrind由内核&#xff08;core&#xff09;以…

C++(9)--裸指针、智能指针、引用

指针1.裸指针的基本概念1.1 裸指针的声明*/初始化&1.2 操作裸指针--间接运算符*1.3 裸指针使用 demo--指向一个简单变量1.4 空指针--nullptr1.5 特殊指针--void *ptr2.指针和引用--引用定义&3.指针和数组3.1 数组指针的定义3.2 数组指针递增/递减操作3.3 指针与数组使用…

关于valgrind的安装和内存泄露分析

程序的安装 如果使用的是tar包安装. valgrind # wget http://valgrind.org/downloads/valgrind-3.9.0.tar.bz2 # tar -jxvf valgrind-3.9.0.tar.bz2 # cd valgrind-3.9.0 # ./autogen.sh # ./configure # make; make install 使用命令: valgrind --tool=memcheck --leak-…

关于mysql的cpu占用高的问题

现在游戏开了泰服 ,发现泰服的cpu占用率总是比繁体或者大陆的高很多,每次都是占用了300%多 top - 15:34:06 up 222 days, 2:51, 2 users, load average: 0.75, 0.73, 0.66 Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie Cpu(s): 52.4%us, 8.5%…

网络原理知识点汇总

OSI七层模型 vs. TCP/IP 五层模型&#xff08;有时候也说四层&#xff09;及各层协议 七层&#xff1a;物理层&#xff1a;为数据端设备提供传送数据的通路&#xff0c; IEEE802 数据链路层&#xff1a;提供介质访问和链路管理&#xff0c; ARP&#xff0c;MTU 网络层&#xf…

无限踩坑系列(8)--猿界神猿

计算机一句话冷知识1.GNU2. Unix与C语言3. Linux与git-hub4. c/c 编译器5. python1.GNU GNU是一个自由的操作系统&#xff0c;其内容软件完全以GPL方式发布。 GNU&#xff1a;GNU’s Not Unix!的递归缩写 Unix 商业化之后&#xff0c; RMS发起了GNU计划&#xff0c;在该计划下…